Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoLmgKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCi8vIE1vZGlmaWVkIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgLSBodHRwOi8vcG9wcGxlci5mcmVlZGVza3RvcC5vcmcKLy8KLy8gQWxsIGNoYW5nZXMgbWFkZSB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IHRvIHRoaXMgZmlsZSBhcmUgbGljZW5zZWQKLy8gdW5kZXIgR1BMIHZlcnNpb24gMiBvciBsYXRlcgovLwovLyBDb3B5cmlnaHQgKEMpIDIwMDUgTWFyY28gUGVzZW50aSBHcml0dGkgPG1wZ0ByZWRoYXQuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMTEgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSBUaG9tYXMgRnJlaXRhZyA8VGhvbWFzLkZyZWl0YWdAYWxmYS5kZT4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIENocmlzdGlhbiBGZXVlcnPkbmdlciA8Y2ZldWVyc2FlbmdlckBnb29nbGVtYWlsLmNvbT4KLy8KLy8gVG8gc2VlIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNoYW5nZXMgcGxlYXNlIHNlZSB0aGUgQ2hhbmdlbG9nIGZpbGUgdGhhdAovLyBjYW1lIHdpdGggeW91ciB0YXJiYWxsIG9yIHR5cGUgbWFrZSBDaGFuZ2VMb2cgaWYgeW91IGFyZSBidWlsZGluZyBmcm9tIGdpdAovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2lmbmRlZiBTUExBU0hfSAojZGVmaW5lIFNQTEFTSF9ICgojaWZkZWYgVVNFX0dDQ19QUkFHTUFTCiNwcmFnbWEgaW50ZXJmYWNlCiNlbmRpZgoKI2luY2x1ZGUgPHN0ZGRlZi5oPgojaW5jbHVkZSAiU3BsYXNoVHlwZXMuaCIKI2luY2x1ZGUgIlNwbGFzaENsaXAuaCIKI2luY2x1ZGUgIlNwbGFzaFBhdHRlcm4uaCIKCmNsYXNzIFNwbGFzaEJpdG1hcDsKc3RydWN0IFNwbGFzaEdseXBoQml0bWFwOwpjbGFzcyBTcGxhc2hTdGF0ZTsKY2xhc3MgU3BsYXNoU2NyZWVuOwpjbGFzcyBTcGxhc2hQYXRoOwpjbGFzcyBTcGxhc2hYUGF0aDsKY2xhc3MgU3BsYXNoRm9udDsKc3RydWN0IFNwbGFzaFBpcGU7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gUmV0cmlldmVzIHRoZSBuZXh0IGxpbmUgb2YgcGl4ZWxzIGluIGFuIGltYWdlIG1hc2suICBOb3JtYWxseSwKLy8gZmlsbHMgaW4gKjxsaW5lPiBhbmQgcmV0dXJucyB0cnVlLiAgSWYgdGhlIGltYWdlIHN0cmVhbSBpcwovLyBleGhhdXN0ZWQsIHJldHVybnMgZmFsc2UuCnR5cGVkZWYgR0Jvb2wgKCpTcGxhc2hJbWFnZU1hc2tTb3VyY2UpKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIHBpeGVsKTsKCi8vIFJldHJpZXZlcyB0aGUgbmV4dCBsaW5lIG9mIHBpeGVscyBpbiBhbiBpbWFnZS4gIE5vcm1hbGx5LCBmaWxscyBpbgovLyAqPGxpbmU+IGFuZCByZXR1cm5zIHRydWUuICBJZiB0aGUgaW1hZ2Ugc3RyZWFtIGlzIGV4aGF1c3RlZCwKLy8gcmV0dXJucyBmYWxzZS4KdHlwZWRlZiBHQm9vbCAoKlNwbGFzaEltYWdlU291cmNlKSh2b2lkICpkYXRhLCBTcGxhc2hDb2xvclB0ciBjb2xvckxpbmUsCgkJCQkgICBHdWNoYXIgKmFscGhhTGluZSk7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZW51bSBTcGxhc2hQaXBlUmVzdWx0Q29sb3JDdHJsIHsKI2lmIFNQTEFTSF9DTVlLCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kQ01ZSywKI2VuZGlmCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kUkdCLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZE1vbm8sCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kTW9ubywKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRSR0IsCiNpZiBTUExBU0hfQ01ZSwogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZENNWUssCiNlbmRpZgogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRSR0IKI2lmIFNQTEFTSF9DTVlLCiAgLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRDTVlLCiNlbmRpZgp9OwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBTcGxhc2ggewpwdWJsaWM6CgogIC8vIENyZWF0ZSBhIG5ldyByYXN0ZXJpemVyIG9iamVjdC4KICBTcGxhc2goU3BsYXNoQml0bWFwICpiaXRtYXBBLCBHQm9vbCB2ZWN0b3JBbnRpYWxpYXNBLAoJIFNwbGFzaFNjcmVlblBhcmFtcyAqc2NyZWVuUGFyYW1zID0gTlVMTCk7CiAgU3BsYXNoKFNwbGFzaEJpdG1hcCAqYml0bWFwQSwgR0Jvb2wgdmVjdG9yQW50aWFsaWFzQSwKCSBTcGxhc2hTY3JlZW4gKnNjcmVlbkEpOwoKICB+U3BsYXNoKCk7CgogIC8vLS0tLS0gc3RhdGUgcmVhZAoKICBTcGxhc2hDb29yZCAqZ2V0TWF0cml4KCk7CiAgU3BsYXNoUGF0dGVybiAqZ2V0U3Ryb2tlUGF0dGVybigpOwogIFNwbGFzaFBhdHRlcm4gKmdldEZpbGxQYXR0ZXJuKCk7CiAgU3BsYXNoU2NyZWVuICpnZXRTY3JlZW4oKTsKICBTcGxhc2hCbGVuZEZ1bmMgZ2V0QmxlbmRGdW5jKCk7CiAgU3BsYXNoQ29vcmQgZ2V0U3Ryb2tlQWxwaGEoKTsKICBTcGxhc2hDb29yZCBnZXRGaWxsQWxwaGEoKTsKICBTcGxhc2hDb29yZCBnZXRMaW5lV2lkdGgoKTsKICBpbnQgZ2V0TGluZUNhcCgpOwogIGludCBnZXRMaW5lSm9pbigpOwogIFNwbGFzaENvb3JkIGdldE1pdGVyTGltaXQoKTsKICBTcGxhc2hDb29yZCBnZXRGbGF0bmVzcygpOwogIFNwbGFzaENvb3JkICpnZXRMaW5lRGFzaCgpOwogIGludCBnZXRMaW5lRGFzaExlbmd0aCgpOwogIFNwbGFzaENvb3JkIGdldExpbmVEYXNoUGhhc2UoKTsKICBTcGxhc2hDbGlwICpnZXRDbGlwKCk7CiAgU3BsYXNoQml0bWFwICpnZXRTb2Z0TWFzaygpOwogIEdCb29sIGdldEluTm9uSXNvbGF0ZWRHcm91cCgpOwoKICAvLy0tLS0tIHN0YXRlIHdyaXRlCgogIHZvaWQgc2V0TWF0cml4KFNwbGFzaENvb3JkICptYXRyaXgpOwogIHZvaWQgc2V0U3Ryb2tlUGF0dGVybihTcGxhc2hQYXR0ZXJuICpzdHJva2VDb2xvcik7CiAgdm9pZCBzZXRGaWxsUGF0dGVybihTcGxhc2hQYXR0ZXJuICpmaWxsQ29sb3IpOwogIHZvaWQgc2V0U2NyZWVuKFNwbGFzaFNjcmVlbiAqc2NyZWVuKTsKICB2b2lkIHNldEJsZW5kRnVuYyhTcGxhc2hCbGVuZEZ1bmMgZnVuYyk7CiAgdm9pZCBzZXRTdHJva2VBbHBoYShTcGxhc2hDb29yZCBhbHBoYSk7CiAgdm9pZCBzZXRGaWxsQWxwaGEoU3BsYXNoQ29vcmQgYWxwaGEpOwogIHZvaWQgc2V0RmlsbE92ZXJwcmludChHQm9vbCBmb3ApOwogIHZvaWQgc2V0U3Ryb2tlT3ZlcnByaW50KEdCb29sIHNvcCk7CiAgdm9pZCBzZXRPdmVycHJpbnRNb2RlKGludCBvcG0pOwogIHZvaWQgc2V0TGluZVdpZHRoKFNwbGFzaENvb3JkIGxpbmVXaWR0aCk7CiAgdm9pZCBzZXRMaW5lQ2FwKGludCBsaW5lQ2FwKTsKICB2b2lkIHNldExpbmVKb2luKGludCBsaW5lSm9pbik7CiAgdm9pZCBzZXRNaXRlckxpbWl0KFNwbGFzaENvb3JkIG1pdGVyTGltaXQpOwogIHZvaWQgc2V0RmxhdG5lc3MoU3BsYXNoQ29vcmQgZmxhdG5lc3MpOwogIC8vIHRoZSA8bGluZURhc2g+IGFycmF5IHdpbGwgYmUgY29waWVkCiAgdm9pZCBzZXRMaW5lRGFzaChTcGxhc2hDb29yZCAqbGluZURhc2gsIGludCBsaW5lRGFzaExlbmd0aCwKCQkgICBTcGxhc2hDb29yZCBsaW5lRGFzaFBoYXNlKTsKICB2b2lkIHNldFN0cm9rZUFkanVzdChHQm9vbCBzdHJva2VBZGp1c3QpOwogIC8vIE5COiB1c2VzIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgogIHZvaWQgY2xpcFJlc2V0VG9SZWN0KFNwbGFzaENvb3JkIHgwLCBTcGxhc2hDb29yZCB5MCwKCQkgICAgICAgU3BsYXNoQ29vcmQgeDEsIFNwbGFzaENvb3JkIHkxKTsKICAvLyBOQjogdXNlcyB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcy4KICBTcGxhc2hFcnJvciBjbGlwVG9SZWN0KFNwbGFzaENvb3JkIHgwLCBTcGxhc2hDb29yZCB5MCwKCQkJIFNwbGFzaENvb3JkIHgxLCBTcGxhc2hDb29yZCB5MSk7CiAgLy8gTkI6IHVzZXMgdW50cmFuc2Zvcm1lZCBjb29yZGluYXRlcy4KICBTcGxhc2hFcnJvciBjbGlwVG9QYXRoKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGVvKTsKICB2b2lkIHNldFNvZnRNYXNrKFNwbGFzaEJpdG1hcCAqc29mdE1hc2spOwogIHZvaWQgc2V0SW5Ob25Jc29sYXRlZEdyb3VwKFNwbGFzaEJpdG1hcCAqYWxwaGEwQml0bWFwQSwKCQkJICAgICBpbnQgYWxwaGEwWEEsIGludCBhbHBoYTBZQSk7CgogIC8vLS0tLS0gc3RhdGUgc2F2ZS9yZXN0b3JlCgogIHZvaWQgc2F2ZVN0YXRlKCk7CiAgU3BsYXNoRXJyb3IgcmVzdG9yZVN0YXRlKCk7CgogIC8vLS0tLS0gZHJhd2luZyBvcGVyYXRpb25zCgogIC8vIEZpbGwgdGhlIGJpdG1hcCB3aXRoIDxjb2xvcj4uICBUaGlzIGlzIG5vdCBzdWJqZWN0IHRvIGNsaXBwaW5nLgogIHZvaWQgY2xlYXIoU3BsYXNoQ29sb3JQdHIgY29sb3IsIEd1Y2hhciBhbHBoYSA9IDB4MDApOwoKICAvLyBTdHJva2UgYSBwYXRoIHVzaW5nIHRoZSBjdXJyZW50IHN0cm9rZSBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIHN0cm9rZShTcGxhc2hQYXRoICpwYXRoKTsKCiAgLy8gRmlsbCBhIHBhdGggdXNpbmcgdGhlIGN1cnJlbnQgZmlsbCBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIGZpbGwoU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZW8pOwoKICAvLyBGaWxsIGEgcGF0aCwgWE9SaW5nIHdpdGggdGhlIGN1cnJlbnQgZmlsbCBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIHhvckZpbGwoU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZW8pOwoKICAvLyBEcmF3IGEgY2hhcmFjdGVyLCB1c2luZyB0aGUgY3VycmVudCBmaWxsIHBhdHRlcm4uCiAgU3BsYXNoRXJyb3IgZmlsbENoYXIoU3BsYXNoQ29vcmQgeCwgU3BsYXNoQ29vcmQgeSwgaW50IGMsIFNwbGFzaEZvbnQgKmZvbnQpOwoKICAvLyBEcmF3IGEgZ2x5cGgsIHVzaW5nIHRoZSBjdXJyZW50IGZpbGwgcGF0dGVybi4gIFRoaXMgZnVuY3Rpb24gZG9lcwogIC8vIG5vdCBmcmVlIGFueSBkYXRhLCBpLmUuLCBpdCBpZ25vcmVzIGdseXBoLT5mcmVlRGF0YS4KICB2b2lkIGZpbGxHbHlwaChTcGxhc2hDb29yZCB4LCBTcGxhc2hDb29yZCB5LAoJCQlTcGxhc2hHbHlwaEJpdG1hcCAqZ2x5cGgpOwoKICAvLyBEcmF3cyBhbiBpbWFnZSBtYXNrIHVzaW5nIHRoZSBmaWxsIGNvbG9yLiAgVGhpcyB3aWxsIHJlYWQgPGg+CiAgLy8gbGluZXMgb2YgPHc+IHBpeGVscyBmcm9tIDxzcmM+LCBzdGFydGluZyB3aXRoIHRoZSB0b3AgbGluZS4gICIxIgogIC8vIHBpeGVscyB3aWxsIGJlIGRyYXduIHdpdGggdGhlIGN1cnJlbnQgZmlsbCBjb2xvcjsgIjAiIHBpeGVscyBhcmUKICAvLyB0cmFuc3BhcmVudC4gIFRoZSBtYXRyaXg6CiAgLy8gICAgWyBtYXRbMF0gbWF0WzFdIDAgXQogIC8vICAgIFsgbWF0WzJdIG1hdFszXSAwIF0KICAvLyAgICBbIG1hdFs0XSBtYXRbNV0gMSBdCiAgLy8gbWFwcyBhIHVuaXQgc3F1YXJlIHRvIHRoZSBkZXNpcmVkIGRlc3RpbmF0aW9uIGZvciB0aGUgaW1hZ2UsIGluCiAgLy8gUG9zdFNjcmlwdCBzdHlsZToKICAvLyAgICBbeCcgeScgMV0gPSBbeCB5IDFdICogbWF0CiAgLy8gTm90ZSB0aGF0IHRoZSBTcGxhc2ggeSBheGlzIHBvaW50cyBkb3dud2FyZCwgYW5kIHRoZSBpbWFnZSBzb3VyY2UKICAvLyBpcyBhc3N1bWVkIHRvIHByb2R1Y2UgcGl4ZWxzIGluIHJhc3RlciBvcmRlciwgc3RhcnRpbmcgZnJvbSB0aGUKICAvLyB0b3AgbGluZS4KICBTcGxhc2hFcnJvciBmaWxsSW1hZ2VNYXNrKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJCSAgICBpbnQgdywgaW50IGgsIFNwbGFzaENvb3JkICptYXQsCgkJCSAgICBHQm9vbCBnbHlwaE1vZGUpOwoKICAvLyBEcmF3IGFuIGltYWdlLiAgVGhpcyB3aWxsIHJlYWQgPGg+IGxpbmVzIG9mIDx3PiBwaXhlbHMgZnJvbQogIC8vIDxzcmM+LCBzdGFydGluZyB3aXRoIHRoZSB0b3AgbGluZS4gIFRoZXNlIHBpeGVscyBhcmUgYXNzdW1lZCB0bwogIC8vIGJlIGluIHRoZSBzb3VyY2UgbW9kZSwgPHNyY01vZGU+LiAgSWYgPHNyY0FscGhhPiBpcyB0cnVlLCB0aGUKICAvLyBhbHBoYSB2YWx1ZXMgcmV0dXJuZWQgYnkgPHNyYz4gYXJlIHVzZWQ7IG90aGVyd2lzZSB0aGV5IGFyZQogIC8vIGlnbm9yZWQuICBUaGUgZm9sbG93aW5nIGNvbWJpbmF0aW9ucyBvZiBzb3VyY2UgYW5kIHRhcmdldCBtb2RlcwogIC8vIGFyZSBzdXBwb3J0ZWQ6CiAgLy8gICAgc291cmNlICAgICAgIHRhcmdldAogIC8vICAgIC0tLS0tLSAgICAgICAtLS0tLS0KICAvLyAgICBNb25vMSAgICAgICAgTW9ubzEKICAvLyAgICBNb25vOCAgICAgICAgTW9ubzEgICAtLSB3aXRoIGRpdGhlcmluZwogIC8vICAgIE1vbm84ICAgICAgICBNb25vOAogIC8vICAgIFJHQjggICAgICAgICBSR0I4CiAgLy8gICAgQkdSOCAgICAgICAgIEJHUjgKICAvLyAgICBDTVlLOCAgICAgICAgQ01ZSzgKICAvLyBUaGUgbWF0cml4IGJlaGF2ZXMgYXMgZm9yIGZpbGxJbWFnZU1hc2suCiAgU3BsYXNoRXJyb3IgZHJhd0ltYWdlKFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkJU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIEdCb29sIHNyY0FscGhhLAoJCQlpbnQgdywgaW50IGgsIFNwbGFzaENvb3JkICptYXQsIFNwbGFzaFBhdHRlcm4gKm92ZXJwcmludFBhdHRlcm4gPSBOVUxMKTsKCiAgLy8gQ29tcG9zaXRlIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gPHNyYz4gb250byB0aGlzIFNwbGFzaAogIC8vIG9iamVjdC4KICBTcGxhc2hFcnJvciBjb21wb3NpdGUoU3BsYXNoQml0bWFwICpzcmMsIGludCB4U3JjLCBpbnQgeVNyYywKCQkJaW50IHhEZXN0LCBpbnQgeURlc3QsIGludCB3LCBpbnQgaCwKCQkJR0Jvb2wgbm9DbGlwLCBHQm9vbCBub25Jc29sYXRlZCk7CgogIC8vIENvbXBvc2l0ZSB0aGlzIFNwbGFzaCBvYmplY3Qgb250byBhIGJhY2tncm91bmQgY29sb3IuICBUaGUKICAvLyBiYWNrZ3JvdW5kIGFscGhhIGlzIGFzc3VtZWQgdG8gYmUgMS4KICB2b2lkIGNvbXBvc2l0ZUJhY2tncm91bmQoU3BsYXNoQ29sb3JQdHIgY29sb3IpOwoKICAvLyBDb3B5IGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gPHNyYz4gb250byB0aGUgYml0bWFwIGJlbG9uZ2luZyB0bwogIC8vIHRoaXMgU3BsYXNoIG9iamVjdC4gIFRoZSBkZXN0aW5hdGlvbiBhbHBoYSB2YWx1ZXMgYXJlIGFsbCBzZXQgdG8KICAvLyB6ZXJvLgogIFNwbGFzaEVycm9yIGJsaXRUcmFuc3BhcmVudChTcGxhc2hCaXRtYXAgKnNyYywgaW50IHhTcmMsIGludCB5U3JjLAoJCQkgICAgICBpbnQgeERlc3QsIGludCB5RGVzdCwgaW50IHcsIGludCBoKTsKCiAgLy8tLS0tLSBtaXNjCgogIC8vIENvbnN0cnVjdCBhIHBhdGggZm9yIGEgc3Ryb2tlLCBnaXZlbiB0aGUgcGF0aCB0byBiZSBzdHJva2VkLCBhbmQKICAvLyB1c2luZyB0aGUgY3VycmVudCBsaW5lIHBhcmFtZXRlcnMuICBJZiA8ZmxhdHRlbj4gaXMgdHJ1ZSwgdGhpcwogIC8vIGZ1bmN0aW9uIHdpbGwgZmlyc3QgZmxhdHRlbiB0aGUgcGF0aCBhbmQgaGFuZGxlIHRoZSBsaW5lZGFzaC4KICBTcGxhc2hQYXRoICptYWtlU3Ryb2tlUGF0aChTcGxhc2hQYXRoICpwYXRoLCBHQm9vbCBmbGF0dGVuID0gZ1RydWUpOwoKICAvLyBSZXR1cm4gdGhlIGFzc29jaWF0ZWQgYml0bWFwLgogIFNwbGFzaEJpdG1hcCAqZ2V0Qml0bWFwKCkgeyByZXR1cm4gYml0bWFwOyB9CgogIC8vIEdldCBhIGJvdW5kaW5nIGJveCB3aGljaCBpbmNsdWRlcyBhbGwgbW9kaWZpY2F0aW9ucyBzaW5jZSB0aGUKICAvLyBsYXN0IGNhbGwgdG8gY2xlYXJNb2RSZWdpb24uCiAgdm9pZCBnZXRNb2RSZWdpb24oaW50ICp4TWluLCBpbnQgKnlNaW4sIGludCAqeE1heCwgaW50ICp5TWF4KQogICAgeyAqeE1pbiA9IG1vZFhNaW47ICp5TWluID0gbW9kWU1pbjsgKnhNYXggPSBtb2RYTWF4OyAqeU1heCA9IG1vZFlNYXg7IH0KCiAgLy8gQ2xlYXIgdGhlIG1vZGlmaWVkIHJlZ2lvbiBib3VuZGluZyBib3guCiAgdm9pZCBjbGVhck1vZFJlZ2lvbigpOwoKICAvLyBHZXQgY2xpcHBpbmcgc3RhdHVzIGZvciB0aGUgbGFzdCBkcmF3aW5nIG9wZXJhdGlvbiBzdWJqZWN0IHRvCiAgLy8gY2xpcHBpbmcuCiAgU3BsYXNoQ2xpcFJlc3VsdCBnZXRDbGlwUmVzKCkgeyByZXR1cm4gb3BDbGlwUmVzOyB9CgogIC8vIFRvZ2dsZSBkZWJ1ZyBtb2RlIG9uIG9yIG9mZi4KICB2b2lkIHNldERlYnVnTW9kZShHQm9vbCBkZWJ1Z01vZGVBKSB7IGRlYnVnTW9kZSA9IGRlYnVnTW9kZUE7IH0KCiNpZiAxIC8vfnRtcDogdHVybiBvZmYgYW50aS1hbGlhc2luZyB0ZW1wb3JhcmlseQogIEdCb29sIGdldFZlY3RvckFudGlhbGlhcygpIHsgcmV0dXJuIHZlY3RvckFudGlhbGlhczsgfQogIHZvaWQgc2V0VmVjdG9yQW50aWFsaWFzKEdCb29sIHZhYSkgeyB2ZWN0b3JBbnRpYWxpYXMgPSB2YWE7IH0KI2VuZGlmCgogIC8vIERvIHNoYWRlZCBmaWxscyB3aXRoIGR5bmFtaWMgcGF0dGVybnMKICBTcGxhc2hFcnJvciBzaGFkZWRGaWxsKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGhhc0JCb3gsCiAgICAgICAgICAgICAgICAgICAgICAgICBTcGxhc2hQYXR0ZXJuICpwYXR0ZXJuKTsKICAvLyBEcmF3IGEgZ291cmF1ZCB0cmlhbmdsZSBzaGFkaW5nLgogIEdCb29sIGdvdXJhdWRUcmlhbmdsZVNoYWRlZEZpbGwoU3BsYXNoR291cmF1ZENvbG9yICpzaGFkaW5nKTsKCnByaXZhdGU6CgogIHZvaWQgcGlwZUluaXQoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgsIGludCB5LAoJCVNwbGFzaFBhdHRlcm4gKnBhdHRlcm4sIFNwbGFzaENvbG9yUHRyIGNTcmMsCgkJU3BsYXNoQ29vcmQgYUlucHV0LCBHQm9vbCB1c2VzU2hhcGUsCgkJR0Jvb2wgbm9uSXNvbGF0ZWRHcm91cCwgU3BsYXNoUGF0dGVybiAqb3ZlcnByaW50UGF0dGVybiA9IE5VTEwsIEdCb29sIHN0cm9rZSA9IGdGYWxzZSk7CiAgdm9pZCBwaXBlUnVuKFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVNldFhZKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4LCBpbnQgeSk7CiAgdm9pZCBwaXBlSW5jWChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIGRyYXdQaXhlbChTcGxhc2hQaXBlICpwaXBlLCBpbnQgeCwgaW50IHksIEdCb29sIG5vQ2xpcCk7CiAgdm9pZCBkcmF3QUFQaXhlbEluaXQoKTsKICB2b2lkIGRyYXdBQVBpeGVsKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4LCBpbnQgeSk7CiAgdm9pZCBkcmF3U3BhbihTcGxhc2hQaXBlICpwaXBlLCBpbnQgeDAsIGludCB4MSwgaW50IHksIEdCb29sIG5vQ2xpcCk7CiAgdm9pZCBkcmF3QUFMaW5lKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4MCwgaW50IHgxLCBpbnQgeSk7CiAgdm9pZCB0cmFuc2Zvcm0oU3BsYXNoQ29vcmQgKm1hdHJpeCwgU3BsYXNoQ29vcmQgeGksIFNwbGFzaENvb3JkIHlpLAoJCSBTcGxhc2hDb29yZCAqeG8sIFNwbGFzaENvb3JkICp5byk7CiAgdm9pZCB1cGRhdGVNb2RYKGludCB4KTsKICB2b2lkIHVwZGF0ZU1vZFkoaW50IHkpOwogIHZvaWQgc3Ryb2tlTmFycm93KFNwbGFzaFBhdGggKnBhdGgpOwogIHZvaWQgc3Ryb2tlV2lkZShTcGxhc2hQYXRoICpwYXRoKTsKICBTcGxhc2hQYXRoICpmbGF0dGVuUGF0aChTcGxhc2hQYXRoICpwYXRoLCBTcGxhc2hDb29yZCAqbWF0cml4LAoJCQkgIFNwbGFzaENvb3JkIGZsYXRuZXNzKTsKICB2b2lkIGZsYXR0ZW5DdXJ2ZShTcGxhc2hDb29yZCB4MCwgU3BsYXNoQ29vcmQgeTAsCgkJICAgIFNwbGFzaENvb3JkIHgxLCBTcGxhc2hDb29yZCB5MSwKCQkgICAgU3BsYXNoQ29vcmQgeDIsIFNwbGFzaENvb3JkIHkyLAoJCSAgICBTcGxhc2hDb29yZCB4MywgU3BsYXNoQ29vcmQgeTMsCgkJICAgIFNwbGFzaENvb3JkICptYXRyaXgsIFNwbGFzaENvb3JkIGZsYXRuZXNzMiwKCQkgICAgU3BsYXNoUGF0aCAqZlBhdGgpOwogIFNwbGFzaFBhdGggKm1ha2VEYXNoZWRQYXRoKFNwbGFzaFBhdGggKnhQYXRoKTsKICBTcGxhc2hFcnJvciBmaWxsV2l0aFBhdHRlcm4oU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZW8sCgkJCSAgICAgIFNwbGFzaFBhdHRlcm4gKnBhdHRlcm4sIFNwbGFzaENvb3JkIGFscGhhKTsKICB2b2lkIGZpbGxHbHlwaDIoaW50IHgwLCBpbnQgeTAsIFNwbGFzaEdseXBoQml0bWFwICpnbHlwaCwgR0Jvb2wgbm9jbGlwKTsKICB2b2lkIGR1bXBQYXRoKFNwbGFzaFBhdGggKnBhdGgpOwogIHZvaWQgZHVtcFhQYXRoKFNwbGFzaFhQYXRoICpwYXRoKTsKCiAgc3RhdGljIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgcGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kW107CiAgc3RhdGljIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgcGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kW107CiAgc3RhdGljIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgcGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZFtdOwogIHN0YXRpYyBpbnQgcGlwZU5vbklzb0dyb3VwQ29ycmVjdGlvbltdOwoKICBTcGxhc2hCaXRtYXAgKmJpdG1hcDsKICBTcGxhc2hTdGF0ZSAqc3RhdGU7CiAgU3BsYXNoQml0bWFwICphYUJ1ZjsKICBpbnQgYWFCdWZZOwogIFNwbGFzaEJpdG1hcCAqYWxwaGEwQml0bWFwOwkvLyBmb3Igbm9uLWlzb2xhdGVkIGdyb3VwcywgdGhpcyBpcyB0aGUKCQkJCS8vICAgYml0bWFwIGNvbnRhaW5pbmcgdGhlIGFscGhhMCB2YWx1ZXMKICBpbnQgYWxwaGEwWCwgYWxwaGEwWTsJCS8vIG9mZnNldCB3aXRoaW4gYWxwaGEwQml0bWFwCiAgU3BsYXNoQ29vcmQgYWFHYW1tYVtzcGxhc2hBQVNpemUgKiBzcGxhc2hBQVNpemUgKyAxXTsKICBpbnQgbW9kWE1pbiwgbW9kWU1pbiwgbW9kWE1heCwgbW9kWU1heDsKICBTcGxhc2hDbGlwUmVzdWx0IG9wQ2xpcFJlczsKICBHQm9vbCB2ZWN0b3JBbnRpYWxpYXM7CiAgR0Jvb2wgZGVidWdNb2RlOwp9OwoKI2VuZGlmCg==