Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoLmgKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCi8vIE1vZGlmaWVkIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgLSBodHRwOi8vcG9wcGxlci5mcmVlZGVza3RvcC5vcmcKLy8KLy8gQWxsIGNoYW5nZXMgbWFkZSB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IHRvIHRoaXMgZmlsZSBhcmUgbGljZW5zZWQKLy8gdW5kZXIgR1BMIHZlcnNpb24gMiBvciBsYXRlcgovLwovLyBDb3B5cmlnaHQgKEMpIDIwMDUgTWFyY28gUGVzZW50aSBHcml0dGkgPG1wZ0ByZWRoYXQuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMTEsIDIwMTggQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzLCAyMDE1IFRob21hcyBGcmVpdGFnIDxUaG9tYXMuRnJlaXRhZ0BhbGZhLmRlPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgQ2hyaXN0aWFuIEZldWVyc+RuZ2VyIDxjZmV1ZXJzYWVuZ2VyQGdvb2dsZW1haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIsIDIwMTcgQWRyaWFuIEpvaG5zb24gPGFqb2huc29uQHJlZG5lb24uY29tPgovLwovLyBUbyBzZWUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hhbmdlcyBwbGVhc2Ugc2VlIHRoZSBDaGFuZ2Vsb2cgZmlsZSB0aGF0Ci8vIGNhbWUgd2l0aCB5b3VyIHRhcmJhbGwgb3IgdHlwZSBtYWtlIENoYW5nZUxvZyBpZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gZ2l0Ci8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaWZuZGVmIFNQTEFTSF9ICiNkZWZpbmUgU1BMQVNIX0gKCiNpZmRlZiBVU0VfR0NDX1BSQUdNQVMKI3ByYWdtYSBpbnRlcmZhY2UKI2VuZGlmCgojaW5jbHVkZSA8c3RkZGVmLmg+CiNpbmNsdWRlICJTcGxhc2hUeXBlcy5oIgojaW5jbHVkZSAiU3BsYXNoQ2xpcC5oIgojaW5jbHVkZSAiU3BsYXNoUGF0dGVybi5oIgoKY2xhc3MgU3BsYXNoQml0bWFwOwpzdHJ1Y3QgU3BsYXNoR2x5cGhCaXRtYXA7CmNsYXNzIFNwbGFzaFN0YXRlOwpjbGFzcyBTcGxhc2hTY3JlZW47CmNsYXNzIFNwbGFzaFBhdGg7CmNsYXNzIFNwbGFzaFhQYXRoOwpjbGFzcyBTcGxhc2hGb250OwpzdHJ1Y3QgU3BsYXNoUGlwZTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBSZXRyaWV2ZXMgdGhlIG5leHQgbGluZSBvZiBwaXhlbHMgaW4gYW4gaW1hZ2UgbWFzay4gIE5vcm1hbGx5LAovLyBmaWxscyBpbiAqPGxpbmU+IGFuZCByZXR1cm5zIHRydWUuICBJZiB0aGUgaW1hZ2Ugc3RyZWFtIGlzCi8vIGV4aGF1c3RlZCwgcmV0dXJucyBmYWxzZS4KdHlwZWRlZiBHQm9vbCAoKlNwbGFzaEltYWdlTWFza1NvdXJjZSkodm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgcGl4ZWwpOwoKLy8gUmV0cmlldmVzIHRoZSBuZXh0IGxpbmUgb2YgcGl4ZWxzIGluIGFuIGltYWdlLiAgTm9ybWFsbHksIGZpbGxzIGluCi8vICo8bGluZT4gYW5kIHJldHVybnMgdHJ1ZS4gIElmIHRoZSBpbWFnZSBzdHJlYW0gaXMgZXhoYXVzdGVkLAovLyByZXR1cm5zIGZhbHNlLgp0eXBlZGVmIEdCb29sICgqU3BsYXNoSW1hZ2VTb3VyY2UpKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIGNvbG9yTGluZSwKCQkJCSAgIEd1Y2hhciAqYWxwaGFMaW5lKTsKCi8vIFVzZSBJQ0NDb2xvclNwYWNlIHRvIHRyYW5zZm9ybSBhIGJpdG1hcAp0eXBlZGVmIHZvaWQgKCpTcGxhc2hJQ0NUcmFuc2Zvcm0pKHZvaWQgKmRhdGEsIFNwbGFzaEJpdG1hcCAqYml0bWFwKTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgplbnVtIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgewojaWZkZWYgU1BMQVNIX0NNWUsKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZERldmljZU4sCiNlbmRpZgogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZFJHQiwKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZE1vbm8sCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kUkdCLAojaWZkZWYgU1BMQVNIX0NNWUsKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZERldmljZU4sCiNlbmRpZgogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRSR0IKI2lmZGVmIFNQTEFTSF9DTVlLCiAgLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmREZXZpY2VOCiNlbmRpZgp9OwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBTcGxhc2ggewpwdWJsaWM6CgogIC8vIENyZWF0ZSBhIG5ldyByYXN0ZXJpemVyIG9iamVjdC4KICBTcGxhc2goU3BsYXNoQml0bWFwICpiaXRtYXBBLCBHQm9vbCB2ZWN0b3JBbnRpYWxpYXNBLAoJIFNwbGFzaFNjcmVlblBhcmFtcyAqc2NyZWVuUGFyYW1zID0gTlVMTCk7CiAgU3BsYXNoKFNwbGFzaEJpdG1hcCAqYml0bWFwQSwgR0Jvb2wgdmVjdG9yQW50aWFsaWFzQSwKCSBTcGxhc2hTY3JlZW4gKnNjcmVlbkEpOwoKICB+U3BsYXNoKCk7CgogIFNwbGFzaChjb25zdCBTcGxhc2ggJikgPSBkZWxldGU7CiAgU3BsYXNoJiBvcGVyYXRvcj0oY29uc3QgU3BsYXNoICYpID0gZGVsZXRlOwoKICAvLy0tLS0tIHN0YXRlIHJlYWQKCiAgU3BsYXNoQ29vcmQgKmdldE1hdHJpeCgpOwogIFNwbGFzaFBhdHRlcm4gKmdldFN0cm9rZVBhdHRlcm4oKTsKICBTcGxhc2hQYXR0ZXJuICpnZXRGaWxsUGF0dGVybigpOwogIFNwbGFzaFNjcmVlbiAqZ2V0U2NyZWVuKCk7CiAgU3BsYXNoQmxlbmRGdW5jIGdldEJsZW5kRnVuYygpOwogIFNwbGFzaENvb3JkIGdldFN0cm9rZUFscGhhKCk7CiAgU3BsYXNoQ29vcmQgZ2V0RmlsbEFscGhhKCk7CiAgU3BsYXNoQ29vcmQgZ2V0TGluZVdpZHRoKCk7CiAgaW50IGdldExpbmVDYXAoKTsKICBpbnQgZ2V0TGluZUpvaW4oKTsKICBTcGxhc2hDb29yZCBnZXRNaXRlckxpbWl0KCk7CiAgU3BsYXNoQ29vcmQgZ2V0RmxhdG5lc3MoKTsKICBTcGxhc2hDb29yZCAqZ2V0TGluZURhc2goKTsKICBpbnQgZ2V0TGluZURhc2hMZW5ndGgoKTsKICBTcGxhc2hDb29yZCBnZXRMaW5lRGFzaFBoYXNlKCk7CiAgR0Jvb2wgZ2V0U3Ryb2tlQWRqdXN0KCk7CiAgU3BsYXNoQ2xpcCAqZ2V0Q2xpcCgpOwogIFNwbGFzaEJpdG1hcCAqZ2V0U29mdE1hc2soKTsKICBHQm9vbCBnZXRJbk5vbklzb2xhdGVkR3JvdXAoKTsKCiAgLy8tLS0tLSBzdGF0ZSB3cml0ZQoKICB2b2lkIHNldE1hdHJpeChTcGxhc2hDb29yZCAqbWF0cml4KTsKICB2b2lkIHNldFN0cm9rZVBhdHRlcm4oU3BsYXNoUGF0dGVybiAqc3Ryb2tlQ29sb3IpOwogIHZvaWQgc2V0RmlsbFBhdHRlcm4oU3BsYXNoUGF0dGVybiAqZmlsbENvbG9yKTsKICB2b2lkIHNldFNjcmVlbihTcGxhc2hTY3JlZW4gKnNjcmVlbik7CiAgdm9pZCBzZXRCbGVuZEZ1bmMoU3BsYXNoQmxlbmRGdW5jIGZ1bmMpOwogIHZvaWQgc2V0U3Ryb2tlQWxwaGEoU3BsYXNoQ29vcmQgYWxwaGEpOwogIHZvaWQgc2V0RmlsbEFscGhhKFNwbGFzaENvb3JkIGFscGhhKTsKICB2b2lkIHNldFBhdHRlcm5BbHBoYShTcGxhc2hDb29yZCBzdHJva2VBbHBoYSwgU3BsYXNoQ29vcmQgZmlsbEFscGhhKTsKICB2b2lkIGNsZWFyUGF0dGVybkFscGhhKCk7CiAgdm9pZCBzZXRGaWxsT3ZlcnByaW50KEdCb29sIGZvcCk7CiAgdm9pZCBzZXRTdHJva2VPdmVycHJpbnQoR0Jvb2wgc29wKTsKICB2b2lkIHNldE92ZXJwcmludE1vZGUoaW50IG9wbSk7CiAgdm9pZCBzZXRMaW5lV2lkdGgoU3BsYXNoQ29vcmQgbGluZVdpZHRoKTsKICB2b2lkIHNldExpbmVDYXAoaW50IGxpbmVDYXApOwogIHZvaWQgc2V0TGluZUpvaW4oaW50IGxpbmVKb2luKTsKICB2b2lkIHNldE1pdGVyTGltaXQoU3BsYXNoQ29vcmQgbWl0ZXJMaW1pdCk7CiAgdm9pZCBzZXRGbGF0bmVzcyhTcGxhc2hDb29yZCBmbGF0bmVzcyk7CiAgLy8gdGhlIDxsaW5lRGFzaD4gYXJyYXkgd2lsbCBiZSBjb3BpZWQKICB2b2lkIHNldExpbmVEYXNoKFNwbGFzaENvb3JkICpsaW5lRGFzaCwgaW50IGxpbmVEYXNoTGVuZ3RoLAoJCSAgIFNwbGFzaENvb3JkIGxpbmVEYXNoUGhhc2UpOwogIHZvaWQgc2V0U3Ryb2tlQWRqdXN0KEdCb29sIHN0cm9rZUFkanVzdCk7CiAgLy8gTkI6IHVzZXMgdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMuCiAgdm9pZCBjbGlwUmVzZXRUb1JlY3QoU3BsYXNoQ29vcmQgeDAsIFNwbGFzaENvb3JkIHkwLAoJCSAgICAgICBTcGxhc2hDb29yZCB4MSwgU3BsYXNoQ29vcmQgeTEpOwogIC8vIE5COiB1c2VzIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgogIFNwbGFzaEVycm9yIGNsaXBUb1JlY3QoU3BsYXNoQ29vcmQgeDAsIFNwbGFzaENvb3JkIHkwLAoJCQkgU3BsYXNoQ29vcmQgeDEsIFNwbGFzaENvb3JkIHkxKTsKICAvLyBOQjogdXNlcyB1bnRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgogIFNwbGFzaEVycm9yIGNsaXBUb1BhdGgoU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZW8pOwogIHZvaWQgc2V0U29mdE1hc2soU3BsYXNoQml0bWFwICpzb2Z0TWFzayk7CiAgdm9pZCBzZXRJbk5vbklzb2xhdGVkR3JvdXAoU3BsYXNoQml0bWFwICphbHBoYTBCaXRtYXBBLAoJCQkgICAgIGludCBhbHBoYTBYQSwgaW50IGFscGhhMFlBKTsKICB2b2lkIHNldFRyYW5zZmVyKEd1Y2hhciAqcmVkLCBHdWNoYXIgKmdyZWVuLCBHdWNoYXIgKmJsdWUsIEd1Y2hhciAqZ3JheSk7CiAgdm9pZCBzZXRPdmVycHJpbnRNYXNrKEd1aW50IG92ZXJwcmludE1hc2ssIEdCb29sIGFkZGl0aXZlKTsKCiAgLy8tLS0tLSBzdGF0ZSBzYXZlL3Jlc3RvcmUKCiAgdm9pZCBzYXZlU3RhdGUoKTsKICBTcGxhc2hFcnJvciByZXN0b3JlU3RhdGUoKTsKCiAgLy8tLS0tLSBkcmF3aW5nIG9wZXJhdGlvbnMKCiAgLy8gRmlsbCB0aGUgYml0bWFwIHdpdGggPGNvbG9yPi4gIFRoaXMgaXMgbm90IHN1YmplY3QgdG8gY2xpcHBpbmcuCiAgdm9pZCBjbGVhcihTcGxhc2hDb2xvclB0ciBjb2xvciwgR3VjaGFyIGFscGhhID0gMHgwMCk7CgogIC8vIFN0cm9rZSBhIHBhdGggdXNpbmcgdGhlIGN1cnJlbnQgc3Ryb2tlIHBhdHRlcm4uCiAgU3BsYXNoRXJyb3Igc3Ryb2tlKFNwbGFzaFBhdGggKnBhdGgpOwoKICAvLyBGaWxsIGEgcGF0aCB1c2luZyB0aGUgY3VycmVudCBmaWxsIHBhdHRlcm4uCiAgU3BsYXNoRXJyb3IgZmlsbChTcGxhc2hQYXRoICpwYXRoLCBHQm9vbCBlbyk7CgogIC8vIEZpbGwgYSBwYXRoLCBYT1Jpbmcgd2l0aCB0aGUgY3VycmVudCBmaWxsIHBhdHRlcm4uCiAgU3BsYXNoRXJyb3IgeG9yRmlsbChTcGxhc2hQYXRoICpwYXRoLCBHQm9vbCBlbyk7CgogIC8vIERyYXcgYSBjaGFyYWN0ZXIsIHVzaW5nIHRoZSBjdXJyZW50IGZpbGwgcGF0dGVybi4KICBTcGxhc2hFcnJvciBmaWxsQ2hhcihTcGxhc2hDb29yZCB4LCBTcGxhc2hDb29yZCB5LCBpbnQgYywgU3BsYXNoRm9udCAqZm9udCk7CgogIC8vIERyYXcgYSBnbHlwaCwgdXNpbmcgdGhlIGN1cnJlbnQgZmlsbCBwYXR0ZXJuLiAgVGhpcyBmdW5jdGlvbiBkb2VzCiAgLy8gbm90IGZyZWUgYW55IGRhdGEsIGkuZS4sIGl0IGlnbm9yZXMgZ2x5cGgtPmZyZWVEYXRhLgogIHZvaWQgZmlsbEdseXBoKFNwbGFzaENvb3JkIHgsIFNwbGFzaENvb3JkIHksCgkJCVNwbGFzaEdseXBoQml0bWFwICpnbHlwaCk7CgogIC8vIERyYXdzIGFuIGltYWdlIG1hc2sgdXNpbmcgdGhlIGZpbGwgY29sb3IuICBUaGlzIHdpbGwgcmVhZCA8aD4KICAvLyBsaW5lcyBvZiA8dz4gcGl4ZWxzIGZyb20gPHNyYz4sIHN0YXJ0aW5nIHdpdGggdGhlIHRvcCBsaW5lLiAgIjEiCiAgLy8gcGl4ZWxzIHdpbGwgYmUgZHJhd24gd2l0aCB0aGUgY3VycmVudCBmaWxsIGNvbG9yOyAiMCIgcGl4ZWxzIGFyZQogIC8vIHRyYW5zcGFyZW50LiAgVGhlIG1hdHJpeDoKICAvLyAgICBbIG1hdFswXSBtYXRbMV0gMCBdCiAgLy8gICAgWyBtYXRbMl0gbWF0WzNdIDAgXQogIC8vICAgIFsgbWF0WzRdIG1hdFs1XSAxIF0KICAvLyBtYXBzIGEgdW5pdCBzcXVhcmUgdG8gdGhlIGRlc2lyZWQgZGVzdGluYXRpb24gZm9yIHRoZSBpbWFnZSwgaW4KICAvLyBQb3N0U2NyaXB0IHN0eWxlOgogIC8vICAgIFt4JyB5JyAxXSA9IFt4IHkgMV0gKiBtYXQKICAvLyBOb3RlIHRoYXQgdGhlIFNwbGFzaCB5IGF4aXMgcG9pbnRzIGRvd253YXJkLCBhbmQgdGhlIGltYWdlIHNvdXJjZQogIC8vIGlzIGFzc3VtZWQgdG8gcHJvZHVjZSBwaXhlbHMgaW4gcmFzdGVyIG9yZGVyLCBzdGFydGluZyBmcm9tIHRoZQogIC8vIHRvcCBsaW5lLgogIFNwbGFzaEVycm9yIGZpbGxJbWFnZU1hc2soU3BsYXNoSW1hZ2VNYXNrU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkJICAgIGludCB3LCBpbnQgaCwgU3BsYXNoQ29vcmQgKm1hdCwKCQkJICAgIEdCb29sIGdseXBoTW9kZSk7CgogIC8vIERyYXcgYW4gaW1hZ2UuICBUaGlzIHdpbGwgcmVhZCA8aD4gbGluZXMgb2YgPHc+IHBpeGVscyBmcm9tCiAgLy8gPHNyYz4sIHN0YXJ0aW5nIHdpdGggdGhlIHRvcCBsaW5lLiAgVGhlc2UgcGl4ZWxzIGFyZSBhc3N1bWVkIHRvCiAgLy8gYmUgaW4gdGhlIHNvdXJjZSBtb2RlLCA8c3JjTW9kZT4uICBJZiA8c3JjQWxwaGE+IGlzIHRydWUsIHRoZQogIC8vIGFscGhhIHZhbHVlcyByZXR1cm5lZCBieSA8c3JjPiBhcmUgdXNlZDsgb3RoZXJ3aXNlIHRoZXkgYXJlCiAgLy8gaWdub3JlZC4gIFRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zIG9mIHNvdXJjZSBhbmQgdGFyZ2V0IG1vZGVzCiAgLy8gYXJlIHN1cHBvcnRlZDoKICAvLyAgICBzb3VyY2UgICAgICAgdGFyZ2V0CiAgLy8gICAgLS0tLS0tICAgICAgIC0tLS0tLQogIC8vICAgIE1vbm8xICAgICAgICBNb25vMQogIC8vICAgIE1vbm84ICAgICAgICBNb25vMSAgIC0tIHdpdGggZGl0aGVyaW5nCiAgLy8gICAgTW9ubzggICAgICAgIE1vbm84CiAgLy8gICAgUkdCOCAgICAgICAgIFJHQjgKICAvLyAgICBCR1I4ICAgICAgICAgQkdSOAogIC8vICAgIENNWUs4ICAgICAgICBDTVlLOAogIC8vIFRoZSBtYXRyaXggYmVoYXZlcyBhcyBmb3IgZmlsbEltYWdlTWFzay4KICBTcGxhc2hFcnJvciBkcmF3SW1hZ2UoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCBTcGxhc2hJQ0NUcmFuc2Zvcm0gdGYsIHZvaWQgKnNyY0RhdGEsCgkJCVNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBHQm9vbCBzcmNBbHBoYSwKCQkJaW50IHcsIGludCBoLCBTcGxhc2hDb29yZCAqbWF0LCBHQm9vbCBpbnRlcnBvbGF0ZSwKCQkJR0Jvb2wgdGlsaW5nUGF0dGVybiA9IGdGYWxzZSk7CgogIC8vIENvbXBvc2l0ZSBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBmcm9tIDxzcmM+IG9udG8gdGhpcyBTcGxhc2gKICAvLyBvYmplY3QuCiAgU3BsYXNoRXJyb3IgY29tcG9zaXRlKFNwbGFzaEJpdG1hcCAqc3JjLCBpbnQgeFNyYywgaW50IHlTcmMsCgkJCWludCB4RGVzdCwgaW50IHlEZXN0LCBpbnQgdywgaW50IGgsCgkJCUdCb29sIG5vQ2xpcCwgR0Jvb2wgbm9uSXNvbGF0ZWQsCgkJCUdCb29sIGtub2Nrb3V0ID0gZ0ZhbHNlLCBTcGxhc2hDb29yZCBrbm9ja291dE9wYWNpdHkgPSAxLjApOwoKICAvLyBDb21wb3NpdGUgdGhpcyBTcGxhc2ggb2JqZWN0IG9udG8gYSBiYWNrZ3JvdW5kIGNvbG9yLiAgVGhlCiAgLy8gYmFja2dyb3VuZCBhbHBoYSBpcyBhc3N1bWVkIHRvIGJlIDEuCiAgdm9pZCBjb21wb3NpdGVCYWNrZ3JvdW5kKFNwbGFzaENvbG9yUHRyIGNvbG9yKTsKCiAgLy8gQ29weSBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBmcm9tIDxzcmM+IG9udG8gdGhlIGJpdG1hcCBiZWxvbmdpbmcgdG8KICAvLyB0aGlzIFNwbGFzaCBvYmplY3QuICBUaGUgZGVzdGluYXRpb24gYWxwaGEgdmFsdWVzIGFyZSBhbGwgc2V0IHRvCiAgLy8gemVyby4KICBTcGxhc2hFcnJvciBibGl0VHJhbnNwYXJlbnQoU3BsYXNoQml0bWFwICpzcmMsIGludCB4U3JjLCBpbnQgeVNyYywKCQkJICAgICAgaW50IHhEZXN0LCBpbnQgeURlc3QsIGludCB3LCBpbnQgaCk7CiAgdm9pZCBibGl0SW1hZ2UoU3BsYXNoQml0bWFwICpzcmMsIEdCb29sIHNyY0FscGhhLCBpbnQgeERlc3QsIGludCB5RGVzdCk7CgogIC8vLS0tLS0gbWlzYwoKICAvLyBDb25zdHJ1Y3QgYSBwYXRoIGZvciBhIHN0cm9rZSwgZ2l2ZW4gdGhlIHBhdGggdG8gYmUgc3Ryb2tlZCBhbmQKICAvLyB0aGUgbGluZSB3aWR0aCA8dz4uICBBbGwgb3RoZXIgc3Ryb2tlIHBhcmFtZXRlcnMgYXJlIHRha2VuIGZyb20KICAvLyB0aGUgY3VycmVudCBzdGF0ZS4gIElmIDxmbGF0dGVuPiBpcyB0cnVlLCB0aGlzIGZ1bmN0aW9uIHdpbGwKICAvLyBmaXJzdCBmbGF0dGVuIHRoZSBwYXRoIGFuZCBoYW5kbGUgdGhlIGxpbmVkYXNoLgogIFNwbGFzaFBhdGggKm1ha2VTdHJva2VQYXRoKFNwbGFzaFBhdGggKnBhdGgsIFNwbGFzaENvb3JkIHcsCgkJCSAgICAgR0Jvb2wgZmxhdHRlbiA9IGdUcnVlKTsKCiAgLy8gUmV0dXJuIHRoZSBhc3NvY2lhdGVkIGJpdG1hcC4KICBTcGxhc2hCaXRtYXAgKmdldEJpdG1hcCgpIHsgcmV0dXJuIGJpdG1hcDsgfQoKICAvLyBTZXQgdGhlIG1pbmltdW0gbGluZSB3aWR0aC4KICB2b2lkIHNldE1pbkxpbmVXaWR0aChTcGxhc2hDb29yZCB3KSB7IG1pbkxpbmVXaWR0aCA9IHc7IH0KCiAgLy8gU2V0dGVyL0dldHRlciBmb3IgdGhpbiBsaW5lIG1vZGUKICB2b2lkIHNldFRoaW5MaW5lTW9kZShTcGxhc2hUaGluTGluZU1vZGUgdGhpbkxpbmVNb2RlQSkgeyB0aGluTGluZU1vZGUgPSB0aGluTGluZU1vZGVBOyB9CiAgU3BsYXNoVGhpbkxpbmVNb2RlIGdldFRoaW5MaW5lTW9kZSgpIHsgcmV0dXJuIHRoaW5MaW5lTW9kZTsgfQoKICAvLyBHZXQgYSBib3VuZGluZyBib3ggd2hpY2ggaW5jbHVkZXMgYWxsIG1vZGlmaWNhdGlvbnMgc2luY2UgdGhlCiAgLy8gbGFzdCBjYWxsIHRvIGNsZWFyTW9kUmVnaW9uLgogIHZvaWQgZ2V0TW9kUmVnaW9uKGludCAqeE1pbiwgaW50ICp5TWluLCBpbnQgKnhNYXgsIGludCAqeU1heCkKICAgIHsgKnhNaW4gPSBtb2RYTWluOyAqeU1pbiA9IG1vZFlNaW47ICp4TWF4ID0gbW9kWE1heDsgKnlNYXggPSBtb2RZTWF4OyB9CgogIC8vIENsZWFyIHRoZSBtb2RpZmllZCByZWdpb24gYm91bmRpbmcgYm94LgogIHZvaWQgY2xlYXJNb2RSZWdpb24oKTsKCiAgLy8gR2V0IGNsaXBwaW5nIHN0YXR1cyBmb3IgdGhlIGxhc3QgZHJhd2luZyBvcGVyYXRpb24gc3ViamVjdCB0bwogIC8vIGNsaXBwaW5nLgogIFNwbGFzaENsaXBSZXN1bHQgZ2V0Q2xpcFJlcygpIHsgcmV0dXJuIG9wQ2xpcFJlczsgfQoKICAvLyBUb2dnbGUgZGVidWcgbW9kZSBvbiBvciBvZmYuCiAgdm9pZCBzZXREZWJ1Z01vZGUoR0Jvb2wgZGVidWdNb2RlQSkgeyBkZWJ1Z01vZGUgPSBkZWJ1Z01vZGVBOyB9CgojaWYgMSAvL350bXA6IHR1cm4gb2ZmIGFudGktYWxpYXNpbmcgdGVtcG9yYXJpbHkKICB2b2lkIHNldEluU2hhZGluZyhHQm9vbCBzaCkgeyBpblNoYWRpbmcgPSBzaDsgfQogIEdCb29sIGdldFZlY3RvckFudGlhbGlhcygpIHsgcmV0dXJuIHZlY3RvckFudGlhbGlhczsgfQogIHZvaWQgc2V0VmVjdG9yQW50aWFsaWFzKEdCb29sIHZhYSkgeyB2ZWN0b3JBbnRpYWxpYXMgPSB2YWE7IH0KI2VuZGlmCgogIC8vIERvIHNoYWRlZCBmaWxscyB3aXRoIGR5bmFtaWMgcGF0dGVybnMKICBTcGxhc2hFcnJvciBzaGFkZWRGaWxsKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGhhc0JCb3gsCiAgICAgICAgICAgICAgICAgICAgICAgICBTcGxhc2hQYXR0ZXJuICpwYXR0ZXJuKTsKICAvLyBEcmF3IGEgZ291cmF1ZCB0cmlhbmdsZSBzaGFkaW5nLgogIEdCb29sIGdvdXJhdWRUcmlhbmdsZVNoYWRlZEZpbGwoU3BsYXNoR291cmF1ZENvbG9yICpzaGFkaW5nKTsKCnByaXZhdGU6CgogIHZvaWQgcGlwZUluaXQoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgsIGludCB5LAoJCVNwbGFzaFBhdHRlcm4gKnBhdHRlcm4sIFNwbGFzaENvbG9yUHRyIGNTcmMsCgkJR3VjaGFyIGFJbnB1dCwgR0Jvb2wgdXNlc1NoYXBlLAoJCUdCb29sIG5vbklzb2xhdGVkR3JvdXAsCgkJR0Jvb2wga25vY2tvdXQgPSBnRmFsc2UsIEd1Y2hhciBrbm9ja291dE9wYWNpdHkgPSAyNTUpOwogIHZvaWQgcGlwZVJ1bihTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5TaW1wbGVNb25vMShTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5TaW1wbGVNb25vOChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5TaW1wbGVSR0I4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZVhCR1I4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZUJHUjgoU3BsYXNoUGlwZSAqcGlwZSk7CiNpZmRlZiBTUExBU0hfQ01ZSwogIHZvaWQgcGlwZVJ1blNpbXBsZUNNWUs4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZURldmljZU44KFNwbGFzaFBpcGUgKnBpcGUpOwojZW5kaWYKICB2b2lkIHBpcGVSdW5BQU1vbm8xKFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1bkFBTW9ubzgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuQUFSR0I4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1bkFBWEJHUjgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuQUFCR1I4KFNwbGFzaFBpcGUgKnBpcGUpOwojaWZkZWYgU1BMQVNIX0NNWUsKICB2b2lkIHBpcGVSdW5BQUNNWUs4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1bkFBRGV2aWNlTjgoU3BsYXNoUGlwZSAqcGlwZSk7CiNlbmRpZgogIHZvaWQgcGlwZVNldFhZKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4LCBpbnQgeSk7CiAgdm9pZCBwaXBlSW5jWChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIGRyYXdQaXhlbChTcGxhc2hQaXBlICpwaXBlLCBpbnQgeCwgaW50IHksIEdCb29sIG5vQ2xpcCk7CiAgdm9pZCBkcmF3QUFQaXhlbEluaXQoKTsKICB2b2lkIGRyYXdBQVBpeGVsKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4LCBpbnQgeSk7CiAgdm9pZCBkcmF3U3BhbihTcGxhc2hQaXBlICpwaXBlLCBpbnQgeDAsIGludCB4MSwgaW50IHksIEdCb29sIG5vQ2xpcCk7CiAgdm9pZCBkcmF3QUFMaW5lKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4MCwgaW50IHgxLCBpbnQgeSwgR0Jvb2wgYWRqdXN0TGluZSA9IGdGYWxzZSwgR3VjaGFyIGxpbmVPcGFjaXR5ID0gMCk7CiAgdm9pZCB0cmFuc2Zvcm0oU3BsYXNoQ29vcmQgKm1hdHJpeCwgU3BsYXNoQ29vcmQgeGksIFNwbGFzaENvb3JkIHlpLAoJCSBTcGxhc2hDb29yZCAqeG8sIFNwbGFzaENvb3JkICp5byk7CiAgdm9pZCB1cGRhdGVNb2RYKGludCB4KTsKICB2b2lkIHVwZGF0ZU1vZFkoaW50IHkpOwogIHZvaWQgc3Ryb2tlTmFycm93KFNwbGFzaFBhdGggKnBhdGgpOwogIHZvaWQgc3Ryb2tlV2lkZShTcGxhc2hQYXRoICpwYXRoLCBTcGxhc2hDb29yZCB3KTsKICBTcGxhc2hQYXRoICpmbGF0dGVuUGF0aChTcGxhc2hQYXRoICpwYXRoLCBTcGxhc2hDb29yZCAqbWF0cml4LAoJCQkgIFNwbGFzaENvb3JkIGZsYXRuZXNzKTsKICB2b2lkIGZsYXR0ZW5DdXJ2ZShTcGxhc2hDb29yZCB4MCwgU3BsYXNoQ29vcmQgeTAsCgkJICAgIFNwbGFzaENvb3JkIHgxLCBTcGxhc2hDb29yZCB5MSwKCQkgICAgU3BsYXNoQ29vcmQgeDIsIFNwbGFzaENvb3JkIHkyLAoJCSAgICBTcGxhc2hDb29yZCB4MywgU3BsYXNoQ29vcmQgeTMsCgkJICAgIFNwbGFzaENvb3JkICptYXRyaXgsIFNwbGFzaENvb3JkIGZsYXRuZXNzMiwKCQkgICAgU3BsYXNoUGF0aCAqZlBhdGgpOwogIFNwbGFzaFBhdGggKm1ha2VEYXNoZWRQYXRoKFNwbGFzaFBhdGggKnhQYXRoKTsKICB2b2lkIGdldEJCb3hGUChTcGxhc2hQYXRoICpwYXRoLCBTcGxhc2hDb29yZCAqeE1pbkEsIFNwbGFzaENvb3JkICp5TWluQSwgU3BsYXNoQ29vcmQgKnhNYXhBLCBTcGxhc2hDb29yZCAqeU1heEEpOwogIFNwbGFzaEVycm9yIGZpbGxXaXRoUGF0dGVybihTcGxhc2hQYXRoICpwYXRoLCBHQm9vbCBlbywKCQkJICAgICAgU3BsYXNoUGF0dGVybiAqcGF0dGVybiwgU3BsYXNoQ29vcmQgYWxwaGEpOwogIEdCb29sIHBhdGhBbGxPdXRzaWRlKFNwbGFzaFBhdGggKnBhdGgpOwogIHZvaWQgZmlsbEdseXBoMihpbnQgeDAsIGludCB5MCwgU3BsYXNoR2x5cGhCaXRtYXAgKmdseXBoLCBHQm9vbCBub2NsaXApOwogIHZvaWQgYXJiaXRyYXJ5VHJhbnNmb3JtTWFzayhTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCQkgICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJCSAgICAgIFNwbGFzaENvb3JkICptYXQsIEdCb29sIGdseXBoTW9kZSk7CiAgU3BsYXNoQml0bWFwICpzY2FsZU1hc2soU3BsYXNoSW1hZ2VNYXNrU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkJICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJCSAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0KTsKICB2b2lkIHNjYWxlTWFza1lkWGQoU3BsYXNoSW1hZ2VNYXNrU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBzY2FsZU1hc2tZZFh1KFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgc2NhbGVNYXNrWXVYZChTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlTWFza1l1WHUoU3BsYXNoSW1hZ2VNYXNrU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBibGl0TWFzayhTcGxhc2hCaXRtYXAgKnNyYywgaW50IHhEZXN0LCBpbnQgeURlc3QsCgkJU3BsYXNoQ2xpcFJlc3VsdCBjbGlwUmVzKTsKICBTcGxhc2hFcnJvciBhcmJpdHJhcnlUcmFuc2Zvcm1JbWFnZShTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIFNwbGFzaElDQ1RyYW5zZm9ybSB0Ziwgdm9pZCAqc3JjRGF0YSwKCQkJICAgICAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCQkgICAgICAgR0Jvb2wgc3JjQWxwaGEsCgkJCSAgICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGxhc2hDb29yZCAqbWF0LCBHQm9vbCBpbnRlcnBvbGF0ZSwgR0Jvb2wgdGlsaW5nUGF0dGVybiA9IGdGYWxzZSk7CiAgU3BsYXNoQml0bWFwICpzY2FsZUltYWdlKFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkJICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJCSAgIEdCb29sIHNyY0FscGhhLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJCSAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwgR0Jvb2wgaW50ZXJwb2xhdGUsIEdCb29sIHRpbGluZ1BhdHRlcm4gPSBnRmFsc2UpOwogIHZvaWQgc2NhbGVJbWFnZVlkWGQoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCSAgICAgIEdCb29sIHNyY0FscGhhLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBzY2FsZUltYWdlWWRYdShTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJICAgICAgR0Jvb2wgc3JjQWxwaGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlSW1hZ2VZdVhkKFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgICBTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgaW50IG5Db21wcywKCQkgICAgICBHQm9vbCBzcmNBbHBoYSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgc2NhbGVJbWFnZVl1WHUoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCSAgICAgIEdCb29sIHNyY0FscGhhLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBzY2FsZUltYWdlWXVYdUJpbGluZWFyKFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgICBTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgaW50IG5Db21wcywKCQkgICAgICBHQm9vbCBzcmNBbHBoYSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgdmVydEZsaXBJbWFnZShTcGxhc2hCaXRtYXAgKmltZywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAoJCSAgICAgaW50IG5Db21wcyk7CiAgdm9pZCBibGl0SW1hZ2UoU3BsYXNoQml0bWFwICpzcmMsIEdCb29sIHNyY0FscGhhLCBpbnQgeERlc3QsIGludCB5RGVzdCwKCQkgU3BsYXNoQ2xpcFJlc3VsdCBjbGlwUmVzKTsKICB2b2lkIGJsaXRJbWFnZUNsaXBwZWQoU3BsYXNoQml0bWFwICpzcmMsIEdCb29sIHNyY0FscGhhLAoJCQlpbnQgeFNyYywgaW50IHlTcmMsIGludCB4RGVzdCwgaW50IHlEZXN0LAoJCQlpbnQgdywgaW50IGgpOwogIHZvaWQgZHVtcFBhdGgoU3BsYXNoUGF0aCAqcGF0aCk7CiAgdm9pZCBkdW1wWFBhdGgoU3BsYXNoWFBhdGggKnBhdGgpOwoKICBzdGF0aWMgU3BsYXNoUGlwZVJlc3VsdENvbG9yQ3RybCBwaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRbXTsKICBzdGF0aWMgU3BsYXNoUGlwZVJlc3VsdENvbG9yQ3RybCBwaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRbXTsKICBzdGF0aWMgU3BsYXNoUGlwZVJlc3VsdENvbG9yQ3RybCBwaXBlUmVzdWx0Q29sb3JBbHBoYUJsZW5kW107CiAgc3RhdGljIGludCBwaXBlTm9uSXNvR3JvdXBDb3JyZWN0aW9uW107CgogIFNwbGFzaEJpdG1hcCAqYml0bWFwOwogIFNwbGFzaFN0YXRlICpzdGF0ZTsKICBTcGxhc2hCaXRtYXAgKmFhQnVmOwogIGludCBhYUJ1Zlk7CiAgU3BsYXNoQml0bWFwICphbHBoYTBCaXRtYXA7CS8vIGZvciBub24taXNvbGF0ZWQgZ3JvdXBzLCB0aGlzIGlzIHRoZQoJCQkJLy8gICBiaXRtYXAgY29udGFpbmluZyB0aGUgYWxwaGEwIHZhbHVlcwogIGludCBhbHBoYTBYLCBhbHBoYTBZOwkJLy8gb2Zmc2V0IHdpdGhpbiBhbHBoYTBCaXRtYXAKICBTcGxhc2hDb29yZCBhYUdhbW1hW3NwbGFzaEFBU2l6ZSAqIHNwbGFzaEFBU2l6ZSArIDFdOwogIFNwbGFzaENvb3JkIG1pbkxpbmVXaWR0aDsKICBTcGxhc2hUaGluTGluZU1vZGUgdGhpbkxpbmVNb2RlOwogIGludCBtb2RYTWluLCBtb2RZTWluLCBtb2RYTWF4LCBtb2RZTWF4OwogIFNwbGFzaENsaXBSZXN1bHQgb3BDbGlwUmVzOwogIEdCb29sIHZlY3RvckFudGlhbGlhczsKICBHQm9vbCBpblNoYWRpbmc7CiAgR0Jvb2wgZGVidWdNb2RlOwp9OwoKI2VuZGlmCg==