Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoLmgKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCi8vIE1vZGlmaWVkIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgLSBodHRwOi8vcG9wcGxlci5mcmVlZGVza3RvcC5vcmcKLy8KLy8gQWxsIGNoYW5nZXMgbWFkZSB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IHRvIHRoaXMgZmlsZSBhcmUgbGljZW5zZWQKLy8gdW5kZXIgR1BMIHZlcnNpb24gMiBvciBsYXRlcgovLwovLyBDb3B5cmlnaHQgKEMpIDIwMDUgTWFyY28gUGVzZW50aSBHcml0dGkgPG1wZ0ByZWRoYXQuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMTEgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzLCAyMDE1IFRob21hcyBGcmVpdGFnIDxUaG9tYXMuRnJlaXRhZ0BhbGZhLmRlPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgQ2hyaXN0aWFuIEZldWVyc+RuZ2VyIDxjZmV1ZXJzYWVuZ2VyQGdvb2dsZW1haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIgQWRyaWFuIEpvaG5zb24gPGFqb2huc29uQHJlZG5lb24uY29tPgovLwovLyBUbyBzZWUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hhbmdlcyBwbGVhc2Ugc2VlIHRoZSBDaGFuZ2Vsb2cgZmlsZSB0aGF0Ci8vIGNhbWUgd2l0aCB5b3VyIHRhcmJhbGwgb3IgdHlwZSBtYWtlIENoYW5nZUxvZyBpZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gZ2l0Ci8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaWZuZGVmIFNQTEFTSF9ICiNkZWZpbmUgU1BMQVNIX0gKCiNpZmRlZiBVU0VfR0NDX1BSQUdNQVMKI3ByYWdtYSBpbnRlcmZhY2UKI2VuZGlmCgojaW5jbHVkZSA8c3RkZGVmLmg+CiNpbmNsdWRlICJTcGxhc2hUeXBlcy5oIgojaW5jbHVkZSAiU3BsYXNoQ2xpcC5oIgojaW5jbHVkZSAiU3BsYXNoUGF0dGVybi5oIgoKY2xhc3MgU3BsYXNoQml0bWFwOwpzdHJ1Y3QgU3BsYXNoR2x5cGhCaXRtYXA7CmNsYXNzIFNwbGFzaFN0YXRlOwpjbGFzcyBTcGxhc2hTY3JlZW47CmNsYXNzIFNwbGFzaFBhdGg7CmNsYXNzIFNwbGFzaFhQYXRoOwpjbGFzcyBTcGxhc2hGb250OwpzdHJ1Y3QgU3BsYXNoUGlwZTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBSZXRyaWV2ZXMgdGhlIG5leHQgbGluZSBvZiBwaXhlbHMgaW4gYW4gaW1hZ2UgbWFzay4gIE5vcm1hbGx5LAovLyBmaWxscyBpbiAqPGxpbmU+IGFuZCByZXR1cm5zIHRydWUuICBJZiB0aGUgaW1hZ2Ugc3RyZWFtIGlzCi8vIGV4aGF1c3RlZCwgcmV0dXJucyBmYWxzZS4KdHlwZWRlZiBHQm9vbCAoKlNwbGFzaEltYWdlTWFza1NvdXJjZSkodm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgcGl4ZWwpOwoKLy8gUmV0cmlldmVzIHRoZSBuZXh0IGxpbmUgb2YgcGl4ZWxzIGluIGFuIGltYWdlLiAgTm9ybWFsbHksIGZpbGxzIGluCi8vICo8bGluZT4gYW5kIHJldHVybnMgdHJ1ZS4gIElmIHRoZSBpbWFnZSBzdHJlYW0gaXMgZXhoYXVzdGVkLAovLyByZXR1cm5zIGZhbHNlLgp0eXBlZGVmIEdCb29sICgqU3BsYXNoSW1hZ2VTb3VyY2UpKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIGNvbG9yTGluZSwKCQkJCSAgIEd1Y2hhciAqYWxwaGFMaW5lKTsKCi8vIFVzZSBJQ0NDb2xvclNwYWNlIHRvIHRyYW5zZm9ybSBhIGJpdG1hcAp0eXBlZGVmIHZvaWQgKCpTcGxhc2hJQ0NUcmFuc2Zvcm0pKHZvaWQgKmRhdGEsIFNwbGFzaEJpdG1hcCAqYml0bWFwKTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgplbnVtIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgewojaWYgU1BMQVNIX0NNWUsKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZERldmljZU4sCiNlbmRpZgogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZFJHQiwKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZE1vbm8sCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kUkdCLAojaWYgU1BMQVNIX0NNWUsKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZERldmljZU4sCiNlbmRpZgogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRSR0IKI2lmIFNQTEFTSF9DTVlLCiAgLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmREZXZpY2VOCiNlbmRpZgp9OwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBTcGxhc2ggewpwdWJsaWM6CgogIC8vIENyZWF0ZSBhIG5ldyByYXN0ZXJpemVyIG9iamVjdC4KICBTcGxhc2goU3BsYXNoQml0bWFwICpiaXRtYXBBLCBHQm9vbCB2ZWN0b3JBbnRpYWxpYXNBLAoJIFNwbGFzaFNjcmVlblBhcmFtcyAqc2NyZWVuUGFyYW1zID0gTlVMTCk7CiAgU3BsYXNoKFNwbGFzaEJpdG1hcCAqYml0bWFwQSwgR0Jvb2wgdmVjdG9yQW50aWFsaWFzQSwKCSBTcGxhc2hTY3JlZW4gKnNjcmVlbkEpOwoKICB+U3BsYXNoKCk7CgogIC8vLS0tLS0gc3RhdGUgcmVhZAoKICBTcGxhc2hDb29yZCAqZ2V0TWF0cml4KCk7CiAgU3BsYXNoUGF0dGVybiAqZ2V0U3Ryb2tlUGF0dGVybigpOwogIFNwbGFzaFBhdHRlcm4gKmdldEZpbGxQYXR0ZXJuKCk7CiAgU3BsYXNoU2NyZWVuICpnZXRTY3JlZW4oKTsKICBTcGxhc2hCbGVuZEZ1bmMgZ2V0QmxlbmRGdW5jKCk7CiAgU3BsYXNoQ29vcmQgZ2V0U3Ryb2tlQWxwaGEoKTsKICBTcGxhc2hDb29yZCBnZXRGaWxsQWxwaGEoKTsKICBTcGxhc2hDb29yZCBnZXRMaW5lV2lkdGgoKTsKICBpbnQgZ2V0TGluZUNhcCgpOwogIGludCBnZXRMaW5lSm9pbigpOwogIFNwbGFzaENvb3JkIGdldE1pdGVyTGltaXQoKTsKICBTcGxhc2hDb29yZCBnZXRGbGF0bmVzcygpOwogIFNwbGFzaENvb3JkICpnZXRMaW5lRGFzaCgpOwogIGludCBnZXRMaW5lRGFzaExlbmd0aCgpOwogIFNwbGFzaENvb3JkIGdldExpbmVEYXNoUGhhc2UoKTsKICBHQm9vbCBnZXRTdHJva2VBZGp1c3QoKTsKICBTcGxhc2hDbGlwICpnZXRDbGlwKCk7CiAgU3BsYXNoQml0bWFwICpnZXRTb2Z0TWFzaygpOwogIEdCb29sIGdldEluTm9uSXNvbGF0ZWRHcm91cCgpOwoKICAvLy0tLS0tIHN0YXRlIHdyaXRlCgogIHZvaWQgc2V0TWF0cml4KFNwbGFzaENvb3JkICptYXRyaXgpOwogIHZvaWQgc2V0U3Ryb2tlUGF0dGVybihTcGxhc2hQYXR0ZXJuICpzdHJva2VDb2xvcik7CiAgdm9pZCBzZXRGaWxsUGF0dGVybihTcGxhc2hQYXR0ZXJuICpmaWxsQ29sb3IpOwogIHZvaWQgc2V0U2NyZWVuKFNwbGFzaFNjcmVlbiAqc2NyZWVuKTsKICB2b2lkIHNldEJsZW5kRnVuYyhTcGxhc2hCbGVuZEZ1bmMgZnVuYyk7CiAgdm9pZCBzZXRTdHJva2VBbHBoYShTcGxhc2hDb29yZCBhbHBoYSk7CiAgdm9pZCBzZXRGaWxsQWxwaGEoU3BsYXNoQ29vcmQgYWxwaGEpOwogIHZvaWQgc2V0RmlsbE92ZXJwcmludChHQm9vbCBmb3ApOwogIHZvaWQgc2V0U3Ryb2tlT3ZlcnByaW50KEdCb29sIHNvcCk7CiAgdm9pZCBzZXRPdmVycHJpbnRNb2RlKGludCBvcG0pOwogIHZvaWQgc2V0TGluZVdpZHRoKFNwbGFzaENvb3JkIGxpbmVXaWR0aCk7CiAgdm9pZCBzZXRMaW5lQ2FwKGludCBsaW5lQ2FwKTsKICB2b2lkIHNldExpbmVKb2luKGludCBsaW5lSm9pbik7CiAgdm9pZCBzZXRNaXRlckxpbWl0KFNwbGFzaENvb3JkIG1pdGVyTGltaXQpOwogIHZvaWQgc2V0RmxhdG5lc3MoU3BsYXNoQ29vcmQgZmxhdG5lc3MpOwogIC8vIHRoZSA8bGluZURhc2g+IGFycmF5IHdpbGwgYmUgY29waWVkCiAgdm9pZCBzZXRMaW5lRGFzaChTcGxhc2hDb29yZCAqbGluZURhc2gsIGludCBsaW5lRGFzaExlbmd0aCwKCQkgICBTcGxhc2hDb29yZCBsaW5lRGFzaFBoYXNlKTsKICB2b2lkIHNldFN0cm9rZUFkanVzdChHQm9vbCBzdHJva2VBZGp1c3QpOwogIC8vIE5COiB1c2VzIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgogIHZvaWQgY2xpcFJlc2V0VG9SZWN0KFNwbGFzaENvb3JkIHgwLCBTcGxhc2hDb29yZCB5MCwKCQkgICAgICAgU3BsYXNoQ29vcmQgeDEsIFNwbGFzaENvb3JkIHkxKTsKICAvLyBOQjogdXNlcyB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcy4KICBTcGxhc2hFcnJvciBjbGlwVG9SZWN0KFNwbGFzaENvb3JkIHgwLCBTcGxhc2hDb29yZCB5MCwKCQkJIFNwbGFzaENvb3JkIHgxLCBTcGxhc2hDb29yZCB5MSk7CiAgLy8gTkI6IHVzZXMgdW50cmFuc2Zvcm1lZCBjb29yZGluYXRlcy4KICBTcGxhc2hFcnJvciBjbGlwVG9QYXRoKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGVvKTsKICB2b2lkIHNldFNvZnRNYXNrKFNwbGFzaEJpdG1hcCAqc29mdE1hc2spOwogIHZvaWQgc2V0SW5Ob25Jc29sYXRlZEdyb3VwKFNwbGFzaEJpdG1hcCAqYWxwaGEwQml0bWFwQSwKCQkJICAgICBpbnQgYWxwaGEwWEEsIGludCBhbHBoYTBZQSk7CiAgdm9pZCBzZXRUcmFuc2ZlcihHdWNoYXIgKnJlZCwgR3VjaGFyICpncmVlbiwgR3VjaGFyICpibHVlLCBHdWNoYXIgKmdyYXkpOwogIHZvaWQgc2V0T3ZlcnByaW50TWFzayhHdWludCBvdmVycHJpbnRNYXNrLCBHQm9vbCBhZGRpdGl2ZSk7CgogIC8vLS0tLS0gc3RhdGUgc2F2ZS9yZXN0b3JlCgogIHZvaWQgc2F2ZVN0YXRlKCk7CiAgU3BsYXNoRXJyb3IgcmVzdG9yZVN0YXRlKCk7CgogIC8vLS0tLS0gZHJhd2luZyBvcGVyYXRpb25zCgogIC8vIEZpbGwgdGhlIGJpdG1hcCB3aXRoIDxjb2xvcj4uICBUaGlzIGlzIG5vdCBzdWJqZWN0IHRvIGNsaXBwaW5nLgogIHZvaWQgY2xlYXIoU3BsYXNoQ29sb3JQdHIgY29sb3IsIEd1Y2hhciBhbHBoYSA9IDB4MDApOwoKICAvLyBTdHJva2UgYSBwYXRoIHVzaW5nIHRoZSBjdXJyZW50IHN0cm9rZSBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIHN0cm9rZShTcGxhc2hQYXRoICpwYXRoKTsKCiAgLy8gRmlsbCBhIHBhdGggdXNpbmcgdGhlIGN1cnJlbnQgZmlsbCBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIGZpbGwoU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZW8pOwoKICAvLyBGaWxsIGEgcGF0aCwgWE9SaW5nIHdpdGggdGhlIGN1cnJlbnQgZmlsbCBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIHhvckZpbGwoU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZW8pOwoKICAvLyBEcmF3IGEgY2hhcmFjdGVyLCB1c2luZyB0aGUgY3VycmVudCBmaWxsIHBhdHRlcm4uCiAgU3BsYXNoRXJyb3IgZmlsbENoYXIoU3BsYXNoQ29vcmQgeCwgU3BsYXNoQ29vcmQgeSwgaW50IGMsIFNwbGFzaEZvbnQgKmZvbnQpOwoKICAvLyBEcmF3IGEgZ2x5cGgsIHVzaW5nIHRoZSBjdXJyZW50IGZpbGwgcGF0dGVybi4gIFRoaXMgZnVuY3Rpb24gZG9lcwogIC8vIG5vdCBmcmVlIGFueSBkYXRhLCBpLmUuLCBpdCBpZ25vcmVzIGdseXBoLT5mcmVlRGF0YS4KICB2b2lkIGZpbGxHbHlwaChTcGxhc2hDb29yZCB4LCBTcGxhc2hDb29yZCB5LAoJCQlTcGxhc2hHbHlwaEJpdG1hcCAqZ2x5cGgpOwoKICAvLyBEcmF3cyBhbiBpbWFnZSBtYXNrIHVzaW5nIHRoZSBmaWxsIGNvbG9yLiAgVGhpcyB3aWxsIHJlYWQgPGg+CiAgLy8gbGluZXMgb2YgPHc+IHBpeGVscyBmcm9tIDxzcmM+LCBzdGFydGluZyB3aXRoIHRoZSB0b3AgbGluZS4gICIxIgogIC8vIHBpeGVscyB3aWxsIGJlIGRyYXduIHdpdGggdGhlIGN1cnJlbnQgZmlsbCBjb2xvcjsgIjAiIHBpeGVscyBhcmUKICAvLyB0cmFuc3BhcmVudC4gIFRoZSBtYXRyaXg6CiAgLy8gICAgWyBtYXRbMF0gbWF0WzFdIDAgXQogIC8vICAgIFsgbWF0WzJdIG1hdFszXSAwIF0KICAvLyAgICBbIG1hdFs0XSBtYXRbNV0gMSBdCiAgLy8gbWFwcyBhIHVuaXQgc3F1YXJlIHRvIHRoZSBkZXNpcmVkIGRlc3RpbmF0aW9uIGZvciB0aGUgaW1hZ2UsIGluCiAgLy8gUG9zdFNjcmlwdCBzdHlsZToKICAvLyAgICBbeCcgeScgMV0gPSBbeCB5IDFdICogbWF0CiAgLy8gTm90ZSB0aGF0IHRoZSBTcGxhc2ggeSBheGlzIHBvaW50cyBkb3dud2FyZCwgYW5kIHRoZSBpbWFnZSBzb3VyY2UKICAvLyBpcyBhc3N1bWVkIHRvIHByb2R1Y2UgcGl4ZWxzIGluIHJhc3RlciBvcmRlciwgc3RhcnRpbmcgZnJvbSB0aGUKICAvLyB0b3AgbGluZS4KICBTcGxhc2hFcnJvciBmaWxsSW1hZ2VNYXNrKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJCSAgICBpbnQgdywgaW50IGgsIFNwbGFzaENvb3JkICptYXQsCgkJCSAgICBHQm9vbCBnbHlwaE1vZGUpOwoKICAvLyBEcmF3IGFuIGltYWdlLiAgVGhpcyB3aWxsIHJlYWQgPGg+IGxpbmVzIG9mIDx3PiBwaXhlbHMgZnJvbQogIC8vIDxzcmM+LCBzdGFydGluZyB3aXRoIHRoZSB0b3AgbGluZS4gIFRoZXNlIHBpeGVscyBhcmUgYXNzdW1lZCB0bwogIC8vIGJlIGluIHRoZSBzb3VyY2UgbW9kZSwgPHNyY01vZGU+LiAgSWYgPHNyY0FscGhhPiBpcyB0cnVlLCB0aGUKICAvLyBhbHBoYSB2YWx1ZXMgcmV0dXJuZWQgYnkgPHNyYz4gYXJlIHVzZWQ7IG90aGVyd2lzZSB0aGV5IGFyZQogIC8vIGlnbm9yZWQuICBUaGUgZm9sbG93aW5nIGNvbWJpbmF0aW9ucyBvZiBzb3VyY2UgYW5kIHRhcmdldCBtb2RlcwogIC8vIGFyZSBzdXBwb3J0ZWQ6CiAgLy8gICAgc291cmNlICAgICAgIHRhcmdldAogIC8vICAgIC0tLS0tLSAgICAgICAtLS0tLS0KICAvLyAgICBNb25vMSAgICAgICAgTW9ubzEKICAvLyAgICBNb25vOCAgICAgICAgTW9ubzEgICAtLSB3aXRoIGRpdGhlcmluZwogIC8vICAgIE1vbm84ICAgICAgICBNb25vOAogIC8vICAgIFJHQjggICAgICAgICBSR0I4CiAgLy8gICAgQkdSOCAgICAgICAgIEJHUjgKICAvLyAgICBDTVlLOCAgICAgICAgQ01ZSzgKICAvLyBUaGUgbWF0cml4IGJlaGF2ZXMgYXMgZm9yIGZpbGxJbWFnZU1hc2suCiAgU3BsYXNoRXJyb3IgZHJhd0ltYWdlKFNwbGFzaEltYWdlU291cmNlIHNyYywgU3BsYXNoSUNDVHJhbnNmb3JtIHRmLCB2b2lkICpzcmNEYXRhLAoJCQlTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgR0Jvb2wgc3JjQWxwaGEsCgkJCWludCB3LCBpbnQgaCwgU3BsYXNoQ29vcmQgKm1hdCwgR0Jvb2wgaW50ZXJwb2xhdGUsCgkJCUdCb29sIHRpbGluZ1BhdHRlcm4gPSBnRmFsc2UpOwoKICAvLyBDb21wb3NpdGUgYSByZWN0YW5ndWxhciByZWdpb24gZnJvbSA8c3JjPiBvbnRvIHRoaXMgU3BsYXNoCiAgLy8gb2JqZWN0LgogIFNwbGFzaEVycm9yIGNvbXBvc2l0ZShTcGxhc2hCaXRtYXAgKnNyYywgaW50IHhTcmMsIGludCB5U3JjLAoJCQlpbnQgeERlc3QsIGludCB5RGVzdCwgaW50IHcsIGludCBoLAoJCQlHQm9vbCBub0NsaXAsIEdCb29sIG5vbklzb2xhdGVkLAoJCQlHQm9vbCBrbm9ja291dCA9IGdGYWxzZSwgU3BsYXNoQ29vcmQga25vY2tvdXRPcGFjaXR5ID0gMS4wKTsKCiAgLy8gQ29tcG9zaXRlIHRoaXMgU3BsYXNoIG9iamVjdCBvbnRvIGEgYmFja2dyb3VuZCBjb2xvci4gIFRoZQogIC8vIGJhY2tncm91bmQgYWxwaGEgaXMgYXNzdW1lZCB0byBiZSAxLgogIHZvaWQgY29tcG9zaXRlQmFja2dyb3VuZChTcGxhc2hDb2xvclB0ciBjb2xvcik7CgogIC8vIENvcHkgYSByZWN0YW5ndWxhciByZWdpb24gZnJvbSA8c3JjPiBvbnRvIHRoZSBiaXRtYXAgYmVsb25naW5nIHRvCiAgLy8gdGhpcyBTcGxhc2ggb2JqZWN0LiAgVGhlIGRlc3RpbmF0aW9uIGFscGhhIHZhbHVlcyBhcmUgYWxsIHNldCB0bwogIC8vIHplcm8uCiAgU3BsYXNoRXJyb3IgYmxpdFRyYW5zcGFyZW50KFNwbGFzaEJpdG1hcCAqc3JjLCBpbnQgeFNyYywgaW50IHlTcmMsCgkJCSAgICAgIGludCB4RGVzdCwgaW50IHlEZXN0LCBpbnQgdywgaW50IGgpOwogIHZvaWQgYmxpdEltYWdlKFNwbGFzaEJpdG1hcCAqc3JjLCBHQm9vbCBzcmNBbHBoYSwgaW50IHhEZXN0LCBpbnQgeURlc3QpOwoKICAvLy0tLS0tIG1pc2MKCiAgLy8gQ29uc3RydWN0IGEgcGF0aCBmb3IgYSBzdHJva2UsIGdpdmVuIHRoZSBwYXRoIHRvIGJlIHN0cm9rZWQgYW5kCiAgLy8gdGhlIGxpbmUgd2lkdGggPHc+LiAgQWxsIG90aGVyIHN0cm9rZSBwYXJhbWV0ZXJzIGFyZSB0YWtlbiBmcm9tCiAgLy8gdGhlIGN1cnJlbnQgc3RhdGUuICBJZiA8ZmxhdHRlbj4gaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiB3aWxsCiAgLy8gZmlyc3QgZmxhdHRlbiB0aGUgcGF0aCBhbmQgaGFuZGxlIHRoZSBsaW5lZGFzaC4KICBTcGxhc2hQYXRoICptYWtlU3Ryb2tlUGF0aChTcGxhc2hQYXRoICpwYXRoLCBTcGxhc2hDb29yZCB3LAoJCQkgICAgIEdCb29sIGZsYXR0ZW4gPSBnVHJ1ZSk7CgogIC8vIFJldHVybiB0aGUgYXNzb2NpYXRlZCBiaXRtYXAuCiAgU3BsYXNoQml0bWFwICpnZXRCaXRtYXAoKSB7IHJldHVybiBiaXRtYXA7IH0KCiAgLy8gU2V0IHRoZSBtaW5pbXVtIGxpbmUgd2lkdGguCiAgdm9pZCBzZXRNaW5MaW5lV2lkdGgoU3BsYXNoQ29vcmQgdykgeyBtaW5MaW5lV2lkdGggPSB3OyB9CgogIC8vIFNldHRlci9HZXR0ZXIgZm9yIHRoaW4gbGluZSBtb2RlCiAgdm9pZCBzZXRUaGluTGluZU1vZGUoU3BsYXNoVGhpbkxpbmVNb2RlIHRoaW5MaW5lTW9kZUEpIHsgdGhpbkxpbmVNb2RlID0gdGhpbkxpbmVNb2RlQTsgfQogIFNwbGFzaFRoaW5MaW5lTW9kZSBnZXRUaGluTGluZU1vZGUoKSB7IHJldHVybiB0aGluTGluZU1vZGU7IH0KCiAgLy8gR2V0IGEgYm91bmRpbmcgYm94IHdoaWNoIGluY2x1ZGVzIGFsbCBtb2RpZmljYXRpb25zIHNpbmNlIHRoZQogIC8vIGxhc3QgY2FsbCB0byBjbGVhck1vZFJlZ2lvbi4KICB2b2lkIGdldE1vZFJlZ2lvbihpbnQgKnhNaW4sIGludCAqeU1pbiwgaW50ICp4TWF4LCBpbnQgKnlNYXgpCiAgICB7ICp4TWluID0gbW9kWE1pbjsgKnlNaW4gPSBtb2RZTWluOyAqeE1heCA9IG1vZFhNYXg7ICp5TWF4ID0gbW9kWU1heDsgfQoKICAvLyBDbGVhciB0aGUgbW9kaWZpZWQgcmVnaW9uIGJvdW5kaW5nIGJveC4KICB2b2lkIGNsZWFyTW9kUmVnaW9uKCk7CgogIC8vIEdldCBjbGlwcGluZyBzdGF0dXMgZm9yIHRoZSBsYXN0IGRyYXdpbmcgb3BlcmF0aW9uIHN1YmplY3QgdG8KICAvLyBjbGlwcGluZy4KICBTcGxhc2hDbGlwUmVzdWx0IGdldENsaXBSZXMoKSB7IHJldHVybiBvcENsaXBSZXM7IH0KCiAgLy8gVG9nZ2xlIGRlYnVnIG1vZGUgb24gb3Igb2ZmLgogIHZvaWQgc2V0RGVidWdNb2RlKEdCb29sIGRlYnVnTW9kZUEpIHsgZGVidWdNb2RlID0gZGVidWdNb2RlQTsgfQoKI2lmIDEgLy9+dG1wOiB0dXJuIG9mZiBhbnRpLWFsaWFzaW5nIHRlbXBvcmFyaWx5CiAgdm9pZCBzZXRJblNoYWRpbmcoR0Jvb2wgc2gpIHsgaW5TaGFkaW5nID0gc2g7IH0KICBHQm9vbCBnZXRWZWN0b3JBbnRpYWxpYXMoKSB7IHJldHVybiB2ZWN0b3JBbnRpYWxpYXM7IH0KICB2b2lkIHNldFZlY3RvckFudGlhbGlhcyhHQm9vbCB2YWEpIHsgdmVjdG9yQW50aWFsaWFzID0gdmFhOyB9CiNlbmRpZgoKICAvLyBEbyBzaGFkZWQgZmlsbHMgd2l0aCBkeW5hbWljIHBhdHRlcm5zCiAgU3BsYXNoRXJyb3Igc2hhZGVkRmlsbChTcGxhc2hQYXRoICpwYXRoLCBHQm9vbCBoYXNCQm94LAogICAgICAgICAgICAgICAgICAgICAgICAgU3BsYXNoUGF0dGVybiAqcGF0dGVybik7CiAgLy8gRHJhdyBhIGdvdXJhdWQgdHJpYW5nbGUgc2hhZGluZy4KICBHQm9vbCBnb3VyYXVkVHJpYW5nbGVTaGFkZWRGaWxsKFNwbGFzaEdvdXJhdWRDb2xvciAqc2hhZGluZyk7Cgpwcml2YXRlOgoKICB2b2lkIHBpcGVJbml0KFNwbGFzaFBpcGUgKnBpcGUsIGludCB4LCBpbnQgeSwKCQlTcGxhc2hQYXR0ZXJuICpwYXR0ZXJuLCBTcGxhc2hDb2xvclB0ciBjU3JjLAoJCUd1Y2hhciBhSW5wdXQsIEdCb29sIHVzZXNTaGFwZSwKCQlHQm9vbCBub25Jc29sYXRlZEdyb3VwLAoJCUdCb29sIGtub2Nrb3V0ID0gZ0ZhbHNlLCBHdWNoYXIga25vY2tvdXRPcGFjaXR5ID0gMjU1KTsKICB2b2lkIHBpcGVSdW4oU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuU2ltcGxlTW9ubzEoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuU2ltcGxlTW9ubzgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuU2ltcGxlUkdCOChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5TaW1wbGVYQkdSOChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5TaW1wbGVCR1I4KFNwbGFzaFBpcGUgKnBpcGUpOwojaWYgU1BMQVNIX0NNWUsKICB2b2lkIHBpcGVSdW5TaW1wbGVDTVlLOChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5TaW1wbGVEZXZpY2VOOChTcGxhc2hQaXBlICpwaXBlKTsKI2VuZGlmCiAgdm9pZCBwaXBlUnVuQUFNb25vMShTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5BQU1vbm84KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1bkFBUkdCOChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5BQVhCR1I4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1bkFBQkdSOChTcGxhc2hQaXBlICpwaXBlKTsKI2lmIFNQTEFTSF9DTVlLCiAgdm9pZCBwaXBlUnVuQUFDTVlLOChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5BQURldmljZU44KFNwbGFzaFBpcGUgKnBpcGUpOwojZW5kaWYKICB2b2lkIHBpcGVTZXRYWShTcGxhc2hQaXBlICpwaXBlLCBpbnQgeCwgaW50IHkpOwogIHZvaWQgcGlwZUluY1goU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBkcmF3UGl4ZWwoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgsIGludCB5LCBHQm9vbCBub0NsaXApOwogIHZvaWQgZHJhd0FBUGl4ZWxJbml0KCk7CiAgdm9pZCBkcmF3QUFQaXhlbChTcGxhc2hQaXBlICpwaXBlLCBpbnQgeCwgaW50IHkpOwogIHZvaWQgZHJhd1NwYW4oU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgwLCBpbnQgeDEsIGludCB5LCBHQm9vbCBub0NsaXApOwogIHZvaWQgZHJhd0FBTGluZShTcGxhc2hQaXBlICpwaXBlLCBpbnQgeDAsIGludCB4MSwgaW50IHksIEdCb29sIGFkanVzdExpbmUgPSBnRmFsc2UsIEd1Y2hhciBsaW5lT3BhY2l0eSA9IDApOwogIHZvaWQgdHJhbnNmb3JtKFNwbGFzaENvb3JkICptYXRyaXgsIFNwbGFzaENvb3JkIHhpLCBTcGxhc2hDb29yZCB5aSwKCQkgU3BsYXNoQ29vcmQgKnhvLCBTcGxhc2hDb29yZCAqeW8pOwogIHZvaWQgdXBkYXRlTW9kWChpbnQgeCk7CiAgdm9pZCB1cGRhdGVNb2RZKGludCB5KTsKICB2b2lkIHN0cm9rZU5hcnJvdyhTcGxhc2hQYXRoICpwYXRoKTsKICB2b2lkIHN0cm9rZVdpZGUoU3BsYXNoUGF0aCAqcGF0aCwgU3BsYXNoQ29vcmQgdyk7CiAgU3BsYXNoUGF0aCAqZmxhdHRlblBhdGgoU3BsYXNoUGF0aCAqcGF0aCwgU3BsYXNoQ29vcmQgKm1hdHJpeCwKCQkJICBTcGxhc2hDb29yZCBmbGF0bmVzcyk7CiAgdm9pZCBmbGF0dGVuQ3VydmUoU3BsYXNoQ29vcmQgeDAsIFNwbGFzaENvb3JkIHkwLAoJCSAgICBTcGxhc2hDb29yZCB4MSwgU3BsYXNoQ29vcmQgeTEsCgkJICAgIFNwbGFzaENvb3JkIHgyLCBTcGxhc2hDb29yZCB5MiwKCQkgICAgU3BsYXNoQ29vcmQgeDMsIFNwbGFzaENvb3JkIHkzLAoJCSAgICBTcGxhc2hDb29yZCAqbWF0cml4LCBTcGxhc2hDb29yZCBmbGF0bmVzczIsCgkJICAgIFNwbGFzaFBhdGggKmZQYXRoKTsKICBTcGxhc2hQYXRoICptYWtlRGFzaGVkUGF0aChTcGxhc2hQYXRoICp4UGF0aCk7CiAgdm9pZCBnZXRCQm94RlAoU3BsYXNoUGF0aCAqcGF0aCwgU3BsYXNoQ29vcmQgKnhNaW5BLCBTcGxhc2hDb29yZCAqeU1pbkEsIFNwbGFzaENvb3JkICp4TWF4QSwgU3BsYXNoQ29vcmQgKnlNYXhBKTsKICBTcGxhc2hFcnJvciBmaWxsV2l0aFBhdHRlcm4oU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZW8sCgkJCSAgICAgIFNwbGFzaFBhdHRlcm4gKnBhdHRlcm4sIFNwbGFzaENvb3JkIGFscGhhKTsKICBHQm9vbCBwYXRoQWxsT3V0c2lkZShTcGxhc2hQYXRoICpwYXRoKTsKICB2b2lkIGZpbGxHbHlwaDIoaW50IHgwLCBpbnQgeTAsIFNwbGFzaEdseXBoQml0bWFwICpnbHlwaCwgR0Jvb2wgbm9jbGlwKTsKICB2b2lkIGFyYml0cmFyeVRyYW5zZm9ybU1hc2soU3BsYXNoSW1hZ2VNYXNrU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkJICAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCQkgICAgICBTcGxhc2hDb29yZCAqbWF0LCBHQm9vbCBnbHlwaE1vZGUpOwogIFNwbGFzaEJpdG1hcCAqc2NhbGVNYXNrKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJCSAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCQkgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCk7CiAgdm9pZCBzY2FsZU1hc2tZZFhkKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgc2NhbGVNYXNrWWRYdShTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlTWFza1l1WGQoU3BsYXNoSW1hZ2VNYXNrU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBzY2FsZU1hc2tZdVh1KFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgYmxpdE1hc2soU3BsYXNoQml0bWFwICpzcmMsIGludCB4RGVzdCwgaW50IHlEZXN0LAoJCVNwbGFzaENsaXBSZXN1bHQgY2xpcFJlcyk7CiAgU3BsYXNoRXJyb3IgYXJiaXRyYXJ5VHJhbnNmb3JtSW1hZ2UoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCBTcGxhc2hJQ0NUcmFuc2Zvcm0gdGYsIHZvaWQgKnNyY0RhdGEsCgkJCSAgICAgICBTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgaW50IG5Db21wcywKCQkJICAgICAgIEdCb29sIHNyY0FscGhhLAoJCQkgICAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BsYXNoQ29vcmQgKm1hdCwgR0Jvb2wgaW50ZXJwb2xhdGUsIEdCb29sIHRpbGluZ1BhdHRlcm4gPSBnRmFsc2UpOwogIFNwbGFzaEJpdG1hcCAqc2NhbGVJbWFnZShTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJCSAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCQkgICBHQm9vbCBzcmNBbHBoYSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCQkgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsIEdCb29sIGludGVycG9sYXRlLCBHQm9vbCB0aWxpbmdQYXR0ZXJuID0gZ0ZhbHNlKTsKICB2b2lkIHNjYWxlSW1hZ2VZZFhkKFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgICBTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgaW50IG5Db21wcywKCQkgICAgICBHQm9vbCBzcmNBbHBoYSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgc2NhbGVJbWFnZVlkWHUoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCSAgICAgIEdCb29sIHNyY0FscGhhLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBzY2FsZUltYWdlWXVYZChTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJICAgICAgR0Jvb2wgc3JjQWxwaGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlSW1hZ2VZdVh1KFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgICBTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgaW50IG5Db21wcywKCQkgICAgICBHQm9vbCBzcmNBbHBoYSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgc2NhbGVJbWFnZVl1WHVCaWxpbmVhcihTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJICAgICAgR0Jvb2wgc3JjQWxwaGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHZlcnRGbGlwSW1hZ2UoU3BsYXNoQml0bWFwICppbWcsIGludCB3aWR0aCwgaW50IGhlaWdodCwKCQkgICAgIGludCBuQ29tcHMpOwogIHZvaWQgYmxpdEltYWdlKFNwbGFzaEJpdG1hcCAqc3JjLCBHQm9vbCBzcmNBbHBoYSwgaW50IHhEZXN0LCBpbnQgeURlc3QsCgkJIFNwbGFzaENsaXBSZXN1bHQgY2xpcFJlcyk7CiAgdm9pZCBibGl0SW1hZ2VDbGlwcGVkKFNwbGFzaEJpdG1hcCAqc3JjLCBHQm9vbCBzcmNBbHBoYSwKCQkJaW50IHhTcmMsIGludCB5U3JjLCBpbnQgeERlc3QsIGludCB5RGVzdCwKCQkJaW50IHcsIGludCBoKTsKICB2b2lkIGR1bXBQYXRoKFNwbGFzaFBhdGggKnBhdGgpOwogIHZvaWQgZHVtcFhQYXRoKFNwbGFzaFhQYXRoICpwYXRoKTsKCiAgc3RhdGljIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgcGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kW107CiAgc3RhdGljIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgcGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kW107CiAgc3RhdGljIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgcGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZFtdOwogIHN0YXRpYyBpbnQgcGlwZU5vbklzb0dyb3VwQ29ycmVjdGlvbltdOwoKICBTcGxhc2hCaXRtYXAgKmJpdG1hcDsKICBTcGxhc2hTdGF0ZSAqc3RhdGU7CiAgU3BsYXNoQml0bWFwICphYUJ1ZjsKICBpbnQgYWFCdWZZOwogIFNwbGFzaEJpdG1hcCAqYWxwaGEwQml0bWFwOwkvLyBmb3Igbm9uLWlzb2xhdGVkIGdyb3VwcywgdGhpcyBpcyB0aGUKCQkJCS8vICAgYml0bWFwIGNvbnRhaW5pbmcgdGhlIGFscGhhMCB2YWx1ZXMKICBpbnQgYWxwaGEwWCwgYWxwaGEwWTsJCS8vIG9mZnNldCB3aXRoaW4gYWxwaGEwQml0bWFwCiAgU3BsYXNoQ29vcmQgYWFHYW1tYVtzcGxhc2hBQVNpemUgKiBzcGxhc2hBQVNpemUgKyAxXTsKICBTcGxhc2hDb29yZCBtaW5MaW5lV2lkdGg7CiAgU3BsYXNoVGhpbkxpbmVNb2RlIHRoaW5MaW5lTW9kZTsKICBpbnQgbW9kWE1pbiwgbW9kWU1pbiwgbW9kWE1heCwgbW9kWU1heDsKICBTcGxhc2hDbGlwUmVzdWx0IG9wQ2xpcFJlczsKICBHQm9vbCB2ZWN0b3JBbnRpYWxpYXM7CiAgR0Jvb2wgaW5TaGFkaW5nOwogIEdCb29sIGRlYnVnTW9kZTsKfTsKCiNlbmRpZgo=