LyoKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIDEwLzEwMC8xMDAwIEJhc2UtVCBFdGhlcm5ldCBEcml2ZXIgZm9yIHRoZSBFVDEzMDEgYW5kIEVUMTMxeCBzZXJpZXMgTUFDcwogKgogKiBDb3B5cmlnaHQgqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIGV0MTMxeF9kZWJ1Zy5oIC0gRGVmaW5lcywgc3RydWN0cywgZW51bXMsIHByb3RvdHlwZXMsIGV0Yy4gdXNlZCBmb3IKICogICAgICAgICAgICAgICAgICBvdXRwdXR0aW5nIGRlYnVnIG1lc3NhZ2VzIHRvIHRoZSBzeXN0ZW0gbG9nZ2luZyBmYWNpbGl0eQogKiAgICAgICAgICAgICAgICAgIChrc3lzbG9nZCkKICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogU09GVFdBUkUgTElDRU5TRQogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwogKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCiAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KICoKICogQ29weXJpZ2h0IKkgMjAwNSBBZ2VyZSBTeXN0ZW1zIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwogKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwogKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBEaXNjbGFpbWVyCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAogKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQogKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKICogREFNQUdFLgogKgogKi8KCiNpZm5kZWYgX19FVDEzMVhfREJHX0hfXwojZGVmaW5lIF9fRVQxMzFYX0RCR19IX18KCi8qIERlZmluZSBNYXNrcyBmb3IgZGVidWdnaW5nIHR5cGVzL2xldmVscyAqLwojZGVmaW5lIERCR19FUlJPUl9PTiAgICAgICAgMHgwMDAwMDAwMUwKI2RlZmluZSBEQkdfV0FSTklOR19PTiAgICAgIDB4MDAwMDAwMDJMCiNkZWZpbmUgREJHX05PVElDRV9PTiAgICAgICAweDAwMDAwMDA0TAojZGVmaW5lIERCR19UUkFDRV9PTiAgICAgICAgMHgwMDAwMDAwOEwKI2RlZmluZSBEQkdfVkVSQk9TRV9PTiAgICAgIDB4MDAwMDAwMTBMCiNkZWZpbmUgREJHX1BBUkFNX09OICAgICAgICAweDAwMDAwMDIwTAojZGVmaW5lIERCR19CUkVBS19PTiAgICAgICAgMHgwMDAwMDA0MEwKI2RlZmluZSBEQkdfUlhfT04gICAgICAgICAgIDB4MDAwMDAxMDBMCiNkZWZpbmUgREJHX1RYX09OICAgICAgICAgICAweDAwMDAwMjAwTAoKI2lmZGVmIENPTkZJR19FVDEzMVhfREVCVUcKCi8qCiAqIFNldCB0aGUgbGV2ZWwgb2YgZGVidWdnaW5nIGlmIG5vdCBkb25lIHdpdGggYSBwcmVwcm9jZXNzb3IgZGVmaW5lLiBTZWUKICogZXQxMzF4X21haW4uYywgZnVuY3Rpb24gZXQxMzF4X2luaXRfbW9kdWxlKCkgZm9yIGhvdyB0aGUgZGVidWcgbGV2ZWwKICogdHJhbnNsYXRlcyBpbnRvIHRoZSB0eXBlcyBvZiBtZXNzYWdlcyBkaXNwbGF5ZWQuCiAqLwojaWZuZGVmIERCR19MVkwKI2RlZmluZSBEQkdfTFZMCTMKI2VuZGlmIC8qIERCR19MVkwgKi8KCiNkZWZpbmUgREJHX0RFRkFVTFRTCQkoREJHX0VSUk9SX09OIHwgREJHX1dBUk5JTkdfT04gfCBEQkdfQlJFQUtfT04pCgojZGVmaW5lIERCR19GTEFHUyhBKQkJKChBKS0+ZGJnRmxhZ3MpCiNkZWZpbmUgREJHX05BTUUoQSkJCSgoQSktPmRiZ05hbWUpCiNkZWZpbmUgREJHX0xFVkVMKEEpCQkoKEEpLT5kYmdMZXZlbCkKCiNpZm5kZWYgREJHX1BSSU5UCiNkZWZpbmUgREJHX1BSSU5UKFMuLi4pCQlwcmludGsoS0VSTl9ERUJVRyBTKQojZW5kaWYgLyogREJHX1BSSU5UICovCgojaWZuZGVmIERCR19QUklOVEMKI2RlZmluZSBEQkdfUFJJTlRDKFMuLi4pCXByaW50ayhTKQojZW5kaWYgLyogREJHX1BSSU5UQyAqLwoKI2lmbmRlZiBEQkdfVFJBUAojZGVmaW5lIERCR19UUkFQCQl7fQkvKiBCVUcoKSAqLwojZW5kaWYgLyogREJHX1RSQVAgKi8KCiNkZWZpbmUgX0VOVEVSX1NUUgkiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiIKI2RlZmluZSBfTEVBVkVfU1RSCSI8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8IgoKI2RlZmluZSBfREJHX0VOVEVSKEEpCXByaW50ayhLRVJOX0RFQlVHICIlczolLipzOiVzXG4iLCBEQkdfTkFNRShBKSwJXAoJCQkJKytEQkdfTEVWRUwoQSksIF9FTlRFUl9TVFIsIF9fZnVuY19fKQojZGVmaW5lIF9EQkdfTEVBVkUoQSkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiUuKnM6JXNcbiIsIERCR19OQU1FKEEpLAlcCgkJCQlEQkdfTEVWRUwoQSktLSwgX0xFQVZFX1NUUiwgX19mdW5jX18pCgojZGVmaW5lIERCR19FTlRFUihBKQkJCQkJCQlcCglkbyB7CQkJCQkJCQlcCgkJaWYgKERCR19GTEFHUyhBKSAmIERCR19UUkFDRV9PTikJCQlcCgkJCV9EQkdfRU5URVIoQSk7CQkJCQlcCgl9IHdoaWxlICgwKQoKI2RlZmluZSBEQkdfTEVBVkUoQSkJCQkJCQkJXAoJZG8gewkJCQkJCQkJXAoJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFJBQ0VfT04pCQkJXAoJCQlfREJHX0xFQVZFKEEpOwkJCQkJXAoJfSB3aGlsZSAoMCkKCiNkZWZpbmUgREJHX1BBUkFNKEEsIE4sIEYsIFMuLi4pCQkJCQlcCglkbyB7CQkJCQkJCQlcCgkJaWYgKERCR19GTEFHUyhBKSAmIERCR19QQVJBTV9PTikJCQlcCgkJCURCR19QUklOVCgiICAlcyAtLSAiRiIgIiwgTiwgUyk7CQlcCgl9IHdoaWxlICgwKQoKI2RlZmluZSBEQkdfRVJST1IoQSwgUy4uLikJCQkJCQkgXAoJZG8gewkJCQkJCQkJIFwKCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX0VSUk9SX09OKSB7CQkJIFwKCQkJREJHX1BSSU5UKCIlczpFUlJPUjolcyAiLCBEQkdfTkFNRShBKSwgX19mdW5jX18pO1wKCQkJREJHX1BSSU5UQyhTKTsJCQkJCSBcCgkJCURCR19UUkFQOwkJCQkJIFwKCQl9CQkJCQkJCSBcCgl9IHdoaWxlICgwKQoKI2RlZmluZSBEQkdfV0FSTklORyhBLCBTLi4uKQkJCQkJCSAgICBcCglkbyB7CQkJCQkJCQkgICAgXAoJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfV0FSTklOR19PTikgewkJCSAgICBcCgkJCURCR19QUklOVCgiJXM6V0FSTklORzolcyAiLCBEQkdfTkFNRShBKSwgX19mdW5jX18pOyBcCgkJCURCR19QUklOVEMoUyk7CQkJCQkgICAgXAoJCX0JCQkJCQkJICAgIFwKCX0gd2hpbGUgKDApCgojZGVmaW5lIERCR19OT1RJQ0UoQSwgUy4uLikJCQkJCQkgICBcCglkbyB7CQkJCQkJCQkgICBcCgkJaWYgKERCR19GTEFHUyhBKSAmIERCR19OT1RJQ0VfT04pIHsJCQkgICBcCgkJCURCR19QUklOVCgiJXM6Tk9USUNFOiVzICIsIERCR19OQU1FKEEpLCBfX2Z1bmNfXyk7IFwKCQkJREJHX1BSSU5UQyhTKTsJCQkJCSAgIFwKCQl9CQkJCQkJCSAgIFwKCX0gd2hpbGUgKDApCgojZGVmaW5lIERCR19UUkFDRShBLCBTLi4uKQkJCQkJCSAgXAoJZG8gewkJCQkJCQkJICBcCgkJaWYgKERCR19GTEFHUyhBKSAmIERCR19UUkFDRV9PTikgewkJCSAgXAoJCQlEQkdfUFJJTlQoIiVzOlRSQUNFOiVzICIsIERCR19OQU1FKEEpLCBfX2Z1bmNfXyk7IFwKCQkJREJHX1BSSU5UQyhTKTsJCQkJCSAgXAoJCX0JCQkJCQkJICBcCgl9IHdoaWxlICgwKQoKI2RlZmluZSBEQkdfVkVSQk9TRShBLCBTLi4uKQkJCQkJCSAgICBcCglkbyB7CQkJCQkJCQkgICAgXAoJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfVkVSQk9TRV9PTikgewkJCSAgICBcCgkJCURCR19QUklOVCgiJXM6VkVSQk9TRTolcyAiLCBEQkdfTkFNRShBKSwgX19mdW5jX18pOyBcCgkJCURCR19QUklOVEMoUyk7CQkJCQkgICAgXAoJCX0JCQkJCQkJICAgIFwKCX0gd2hpbGUgKDApCgojZGVmaW5lIERCR19SWChBLCBTLi4uKQkJCQlcCglkbyB7CQkJCQlcCgkJaWYgKERCR19GTEFHUyhBKSAmIERCR19SWF9PTikJXAoJCQlEQkdfUFJJTlQoUyk7CQlcCgl9IHdoaWxlICgwKQoKI2RlZmluZSBEQkdfUlhfRU5URVIoQSkJCQkJXAoJZG8gewkJCQkJXAoJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfUlhfT04pCVwKCQkJX0RCR19FTlRFUihBKTsJCVwKCX0gd2hpbGUgKDApCgojZGVmaW5lIERCR19SWF9MRUFWRShBKQkJCQlcCglkbyB7CQkJCQlcCgkJaWYgKERCR19GTEFHUyhBKSAmIERCR19SWF9PTikJXAoJCQlfREJHX0xFQVZFKEEpOwkJXAoJfSB3aGlsZSAoMCkKCiNkZWZpbmUgREJHX1RYKEEsIFMuLi4pCQkJCVwKCWRvIHsJCQkJCVwKCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RYX09OKQlcCgkJCURCR19QUklOVChTKTsJCVwKCX0gd2hpbGUgKDApCgojZGVmaW5lIERCR19UWF9FTlRFUihBKQkJCQlcCglkbyB7CQkJCQlcCgkJaWYgKERCR19GTEFHUyhBKSAmIERCR19UWF9PTikJXAoJCQlfREJHX0VOVEVSKEEpOwkJXAoJfSB3aGlsZSAoMCkKCiNkZWZpbmUgREJHX1RYX0xFQVZFKEEpCQkJCVwKCWRvIHsJCQkJCVwKCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RYX09OKQlcCgkJCV9EQkdfTEVBVkUoQSk7CQlcCgl9IHdoaWxlICgwKQoKI2RlZmluZSBEQkdfQVNTRVJUKEMpCQkJCQkJXAoJZG8gewkJCQkJCQlcCgkJaWYgKCEoQykpIHsJCQkJCVwKCQkJREJHX1BSSU5UKCJBU1NFUlQoJXMpIC0tICVzIyVkICglcykgIiwgIFwKCQkJICAgICAjQywgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7IFwKCQkJREJHX1RSQVA7CQkJCVwKCQl9CQkJCQkJXAoJfSB3aGlsZSAoMCkKCiNkZWZpbmUgU1RBVElDCgp0eXBlZGVmIHN0cnVjdCB7CgljaGFyICpkYmdOYW1lOwoJaW50IGRiZ0xldmVsOwoJdW5zaWduZWQgbG9uZyBkYmdGbGFnczsKfSBkYmdfaW5mb190OwoKI2Vsc2UgLyogQ09ORklHX0VUMTMxWF9ERUJVRyAqLwoKI2RlZmluZSBEQkdfREVGTgojZGVmaW5lIERCR19UUkFQCiNkZWZpbmUgREJHX1BSSU5UKFMuLi4pCiNkZWZpbmUgREJHX0VOVEVSKEEpCiNkZWZpbmUgREJHX0xFQVZFKEEpCiNkZWZpbmUgREJHX1BBUkFNKEEsTixGLFMuLi4pCiNkZWZpbmUgREJHX0VSUk9SKEEsUy4uLikKI2RlZmluZSBEQkdfV0FSTklORyhBLFMuLi4pCiNkZWZpbmUgREJHX05PVElDRShBLFMuLi4pCiNkZWZpbmUgREJHX1RSQUNFKEEsUy4uLikKI2RlZmluZSBEQkdfVkVSQk9TRShBLFMuLi4pCiNkZWZpbmUgREJHX1JYKEEsUy4uLikKI2RlZmluZSBEQkdfUlhfRU5URVIoQSkKI2RlZmluZSBEQkdfUlhfTEVBVkUoQSkKI2RlZmluZSBEQkdfVFgoQSxTLi4uKQojZGVmaW5lIERCR19UWF9FTlRFUihBKQojZGVmaW5lIERCR19UWF9MRUFWRShBKQojZGVmaW5lIERCR19BU1NFUlQoQykKI2RlZmluZSBTVEFUSUMgc3RhdGljCgojZW5kaWYgLyogQ09ORklHX0VUMTMxWF9ERUJVRyAqLwoKLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZSAqLwpzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXI7Cgp2b2lkIER1bXBUeFF1ZXVlQ29udGVudHMoaW50IGRiZ0x2bCwgc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKdm9pZCBEdW1wRGV2aWNlQmxvY2soaW50IGRiZ0x2bCwgc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLAoJCSAgICAgdW5zaWduZWQgaW50IEJsb2NrKTsKdm9pZCBEdW1wRGV2aWNlUmVnKGludCBkYmdMdmwsIHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CgojZW5kaWYgLyogX19FVDEzMVhfREJHX0hfXyAqLwo=