Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoT3V0cHV0RGV2LmgKLy8KLy8gQ29weXJpZ2h0IDIwMDMgR2x5cGggJiBDb2csIExMQwovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gTW9kaWZpZWQgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCAtIGh0dHA6Ly9wb3BwbGVyLmZyZWVkZXNrdG9wLm9yZwovLwovLyBBbGwgY2hhbmdlcyBtYWRlIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgdG8gdGhpcyBmaWxlIGFyZSBsaWNlbnNlZAovLyB1bmRlciBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyCi8vCi8vIENvcHlyaWdodCAoQykgMjAwNSBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+Ci8vIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBGcmVpdGFnIDxUaG9tYXMuRnJlaXRhZ0BhbGZhLmRlPgovLyBDb3B5cmlnaHQgKEMpIDIwMDkgQ2FybG9zIEdhcmNpYSBDYW1wb3MgPGNhcmxvc2djQGdub21lLm9yZz4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIENocmlzdGlhbiBGZXVlcnPkbmdlciA8Y2ZldWVyc2FlbmdlckBnb29nbGVtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDExIEFuZHJlYXMgSGFydG1ldHogPGFoYXJ0bWV0ekBnbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMSBBbmRyZWEgQ2FuY2lhbmkgPHJhbm1hNDJAZ21haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTcgQWRyaWFuIEpvaG5zb24gPGFqb2huc29uQHJlZG5lb24uY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIsIDIwMTUsIDIwMTggQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAxNSwgMjAxNiBXaWxsaWFtIEJhZGVyIDx3aWxsaWFtYmFkZXJAaG90bWFpbC5jb20+Ci8vCi8vIFRvIHNlZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGFuZ2VzIHBsZWFzZSBzZWUgdGhlIENoYW5nZWxvZyBmaWxlIHRoYXQKLy8gY2FtZSB3aXRoIHlvdXIgdGFyYmFsbCBvciB0eXBlIG1ha2UgQ2hhbmdlTG9nIGlmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSBnaXQKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpZm5kZWYgU1BMQVNIT1VUUFVUREVWX0gKI2RlZmluZSBTUExBU0hPVVRQVVRERVZfSAoKI2lmZGVmIFVTRV9HQ0NfUFJBR01BUwojcHJhZ21hIGludGVyZmFjZQojZW5kaWYKCiNpbmNsdWRlICJnb28vZ3R5cGVzLmgiCiNpbmNsdWRlICJzcGxhc2gvU3BsYXNoVHlwZXMuaCIKI2luY2x1ZGUgInNwbGFzaC9TcGxhc2hQYXR0ZXJuLmgiCiNpbmNsdWRlICJwb3BwbGVyLWNvbmZpZy5oIgojaW5jbHVkZSAiT3V0cHV0RGV2LmgiCiNpbmNsdWRlICJHZnhTdGF0ZS5oIgojaW5jbHVkZSAiR2xvYmFsUGFyYW1zLmgiCgpjbGFzcyBQREZEb2M7CmNsYXNzIEdmeDhCaXRGb250OwpjbGFzcyBTcGxhc2hCaXRtYXA7CmNsYXNzIFNwbGFzaDsKY2xhc3MgU3BsYXNoUGF0aDsKY2xhc3MgU3BsYXNoRm9udEVuZ2luZTsKY2xhc3MgU3BsYXNoRm9udDsKY2xhc3MgVDNGb250Q2FjaGU7CnN0cnVjdCBUM0ZvbnRDYWNoZVRhZzsKc3RydWN0IFQzR2x5cGhTdGFjazsKc3RydWN0IFNwbGFzaFRyYW5zcGFyZW5jeUdyb3VwOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoIGR5bmFtaWMgcGF0dGVybgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY2xhc3MgU3BsYXNoRnVuY3Rpb25QYXR0ZXJuOiBwdWJsaWMgU3BsYXNoUGF0dGVybiB7CnB1YmxpYzoKCiAgU3BsYXNoRnVuY3Rpb25QYXR0ZXJuKFNwbGFzaENvbG9yTW9kZSBjb2xvck1vZGUsIEdmeFN0YXRlICpzdGF0ZSwgR2Z4RnVuY3Rpb25TaGFkaW5nICpzaGFkaW5nKTsKCiAgU3BsYXNoUGF0dGVybiAqY29weSgpIG92ZXJyaWRlIHsgcmV0dXJuIG5ldyBTcGxhc2hGdW5jdGlvblBhdHRlcm4oY29sb3JNb2RlLCBzdGF0ZSwgKEdmeEZ1bmN0aW9uU2hhZGluZyAqKSBzaGFkaW5nKTsgfQoKICB+U3BsYXNoRnVuY3Rpb25QYXR0ZXJuKCk7CgogIEdCb29sIHRlc3RQb3NpdGlvbihpbnQgeCwgaW50IHkpIG92ZXJyaWRlIHsgcmV0dXJuIGdUcnVlOyB9CgogIEdCb29sIGlzU3RhdGljKCkgb3ZlcnJpZGUgeyByZXR1cm4gZ0ZhbHNlOyB9CgogIEdCb29sIGdldENvbG9yKGludCB4LCBpbnQgeSwgU3BsYXNoQ29sb3JQdHIgYykgb3ZlcnJpZGU7CgogIHZpcnR1YWwgR2Z4RnVuY3Rpb25TaGFkaW5nICpnZXRTaGFkaW5nKCkgeyByZXR1cm4gc2hhZGluZzsgfQoKICBHQm9vbCBpc0NNWUsoKSBvdmVycmlkZSB7IHJldHVybiBnZnhNb2RlID09IGNzRGV2aWNlQ01ZSzsgfQoKcHJvdGVjdGVkOgogIE1hdHJpeCBpY3RtOwogIGRvdWJsZSB4TWluLCB5TWluLCB4TWF4LCB5TWF4OwogIEdmeEZ1bmN0aW9uU2hhZGluZyAqc2hhZGluZzsKICBHZnhTdGF0ZSAqc3RhdGU7CiAgU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZTsKICBHZnhDb2xvclNwYWNlTW9kZSBnZnhNb2RlOwp9OwoKY2xhc3MgU3BsYXNoVW5pdmFyaWF0ZVBhdHRlcm46IHB1YmxpYyBTcGxhc2hQYXR0ZXJuIHsKcHVibGljOgoKICBTcGxhc2hVbml2YXJpYXRlUGF0dGVybihTcGxhc2hDb2xvck1vZGUgY29sb3JNb2RlLCBHZnhTdGF0ZSAqc3RhdGUsIEdmeFVuaXZhcmlhdGVTaGFkaW5nICpzaGFkaW5nKTsKCiAgflNwbGFzaFVuaXZhcmlhdGVQYXR0ZXJuKCk7CgogIEdCb29sIGdldENvbG9yKGludCB4LCBpbnQgeSwgU3BsYXNoQ29sb3JQdHIgYykgb3ZlcnJpZGU7CgogIEdCb29sIHRlc3RQb3NpdGlvbihpbnQgeCwgaW50IHkpIG92ZXJyaWRlOwoKICBHQm9vbCBpc1N0YXRpYygpIG92ZXJyaWRlIHsgcmV0dXJuIGdGYWxzZTsgfQoKICB2aXJ0dWFsIEdCb29sIGdldFBhcmFtZXRlcihkb3VibGUgeHMsIGRvdWJsZSB5cywgZG91YmxlICp0KSA9IDA7CgogIHZpcnR1YWwgR2Z4VW5pdmFyaWF0ZVNoYWRpbmcgKmdldFNoYWRpbmcoKSB7IHJldHVybiBzaGFkaW5nOyB9CgogIEdCb29sIGlzQ01ZSygpIG92ZXJyaWRlIHsgcmV0dXJuIGdmeE1vZGUgPT0gY3NEZXZpY2VDTVlLOyB9Cgpwcm90ZWN0ZWQ6CiAgTWF0cml4IGljdG07CiAgZG91YmxlIHQwLCB0MSwgZHQ7CiAgR2Z4VW5pdmFyaWF0ZVNoYWRpbmcgKnNoYWRpbmc7CiAgR2Z4U3RhdGUgKnN0YXRlOwogIFNwbGFzaENvbG9yTW9kZSBjb2xvck1vZGU7CiAgR2Z4Q29sb3JTcGFjZU1vZGUgZ2Z4TW9kZTsKfTsKCmNsYXNzIFNwbGFzaEF4aWFsUGF0dGVybjogcHVibGljIFNwbGFzaFVuaXZhcmlhdGVQYXR0ZXJuIHsKcHVibGljOgoKICBTcGxhc2hBeGlhbFBhdHRlcm4oU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZSwgR2Z4U3RhdGUgKnN0YXRlLCBHZnhBeGlhbFNoYWRpbmcgKnNoYWRpbmcpOwoKICBTcGxhc2hQYXR0ZXJuICpjb3B5KCkgb3ZlcnJpZGUgeyByZXR1cm4gbmV3IFNwbGFzaEF4aWFsUGF0dGVybihjb2xvck1vZGUsIHN0YXRlLCAoR2Z4QXhpYWxTaGFkaW5nICopIHNoYWRpbmcpOyB9CgogIH5TcGxhc2hBeGlhbFBhdHRlcm4oKTsKCiAgR0Jvb2wgZ2V0UGFyYW1ldGVyKGRvdWJsZSB4cywgZG91YmxlIHlzLCBkb3VibGUgKnQpIG92ZXJyaWRlOwoKcHJpdmF0ZToKICBkb3VibGUgeDAsIHkwLCB4MSwgeTE7CiAgZG91YmxlIGR4LCBkeSwgbXVsOwp9OwoKLy8gc2VlIEdmeFN0YXRlLmgsIEdmeEdvdXJhdWRUcmlhbmdsZVNoYWRpbmcKY2xhc3MgU3BsYXNoR291cmF1ZFBhdHRlcm46IHB1YmxpYyBTcGxhc2hHb3VyYXVkQ29sb3IgewpwdWJsaWM6CgogIFNwbGFzaEdvdXJhdWRQYXR0ZXJuKEdCb29sIGJEaXJlY3RDb2xvclRyYW5zbGF0aW9uLCBHZnhTdGF0ZSAqc3RhdGUsIEdmeEdvdXJhdWRUcmlhbmdsZVNoYWRpbmcgKnNoYWRpbmcsIFNwbGFzaENvbG9yTW9kZSBtb2RlKTsKCiAgU3BsYXNoUGF0dGVybiAqY29weSgpIG92ZXJyaWRlIHsgcmV0dXJuIG5ldyBTcGxhc2hHb3VyYXVkUGF0dGVybihiRGlyZWN0Q29sb3JUcmFuc2xhdGlvbiwgc3RhdGUsIHNoYWRpbmcsIG1vZGUpOyB9CgogIH5TcGxhc2hHb3VyYXVkUGF0dGVybigpOwoKICBHQm9vbCBnZXRDb2xvcihpbnQgeCwgaW50IHksIFNwbGFzaENvbG9yUHRyIGMpIG92ZXJyaWRlIHsgcmV0dXJuIGdGYWxzZTsgfQoKICBHQm9vbCB0ZXN0UG9zaXRpb24oaW50IHgsIGludCB5KSBvdmVycmlkZSB7IHJldHVybiBnRmFsc2U7IH0KCiAgR0Jvb2wgaXNTdGF0aWMoKSBvdmVycmlkZSB7IHJldHVybiBnRmFsc2U7IH0KCiAgR0Jvb2wgaXNDTVlLKCkgb3ZlcnJpZGUgeyByZXR1cm4gZ2Z4TW9kZSA9PSBjc0RldmljZUNNWUs7IH0KCiAgR0Jvb2wgaXNQYXJhbWV0ZXJpemVkKCkgb3ZlcnJpZGUgeyByZXR1cm4gc2hhZGluZy0+aXNQYXJhbWV0ZXJpemVkKCk7IH0KICBpbnQgZ2V0TlRyaWFuZ2xlcygpIG92ZXJyaWRlIHsgcmV0dXJuIHNoYWRpbmctPmdldE5UcmlhbmdsZXMoKTsgfQogICB2b2lkIGdldFRyaWFuZ2xlKGludCBpLCBkb3VibGUgKngwLCBkb3VibGUgKnkwLCBkb3VibGUgKmNvbG9yMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqeDEsIGRvdWJsZSAqeTEsIGRvdWJsZSAqY29sb3IxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICp4MiwgZG91YmxlICp5MiwgZG91YmxlICpjb2xvcjIpIG92ZXJyaWRlCiAgeyBzaGFkaW5nLT5nZXRUcmlhbmdsZShpLCB4MCwgeTAsIGNvbG9yMCwgeDEsIHkxLCBjb2xvcjEsIHgyLCB5MiwgY29sb3IyKTsgfQoKICB2b2lkIGdldFBhcmFtZXRlcml6ZWRDb2xvcihkb3VibGUgdCwgU3BsYXNoQ29sb3JNb2RlIG1vZGUsIFNwbGFzaENvbG9yUHRyIGMpIG92ZXJyaWRlOwoKcHJpdmF0ZToKICBHZnhHb3VyYXVkVHJpYW5nbGVTaGFkaW5nICpzaGFkaW5nOwogIEdmeFN0YXRlICpzdGF0ZTsKICBHQm9vbCBiRGlyZWN0Q29sb3JUcmFuc2xhdGlvbjsKICBTcGxhc2hDb2xvck1vZGUgbW9kZTsKICBHZnhDb2xvclNwYWNlTW9kZSBnZnhNb2RlOwp9OwoKLy8gc2VlIEdmeFN0YXRlLmgsIEdmeFJhZGlhbFNoYWRpbmcKY2xhc3MgU3BsYXNoUmFkaWFsUGF0dGVybjogcHVibGljIFNwbGFzaFVuaXZhcmlhdGVQYXR0ZXJuIHsKcHVibGljOgoKICBTcGxhc2hSYWRpYWxQYXR0ZXJuKFNwbGFzaENvbG9yTW9kZSBjb2xvck1vZGUsIEdmeFN0YXRlICpzdGF0ZSwgR2Z4UmFkaWFsU2hhZGluZyAqc2hhZGluZyk7CgogIFNwbGFzaFBhdHRlcm4gKmNvcHkoKSBvdmVycmlkZSB7IHJldHVybiBuZXcgU3BsYXNoUmFkaWFsUGF0dGVybihjb2xvck1vZGUsIHN0YXRlLCAoR2Z4UmFkaWFsU2hhZGluZyAqKSBzaGFkaW5nKTsgfQoKICB+U3BsYXNoUmFkaWFsUGF0dGVybigpOwoKICBHQm9vbCBnZXRQYXJhbWV0ZXIoZG91YmxlIHhzLCBkb3VibGUgeXMsIGRvdWJsZSAqdCkgb3ZlcnJpZGU7Cgpwcml2YXRlOgogIGRvdWJsZSB4MCwgeTAsIHIwLCBkeCwgZHksIGRyOwogIGRvdWJsZSBhLCBpbnZhOwp9OwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIG51bWJlciBvZiBUeXBlIDMgZm9udHMgdG8gY2FjaGUKI2RlZmluZSBzcGxhc2hPdXRUM0ZvbnRDYWNoZVNpemUgOAoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoT3V0cHV0RGV2Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBTcGxhc2hPdXRwdXREZXY6IHB1YmxpYyBPdXRwdXREZXYgewpwdWJsaWM6CgogIC8vIENvbnN0cnVjdG9yLgogIFNwbGFzaE91dHB1dERldihTcGxhc2hDb2xvck1vZGUgY29sb3JNb2RlQSwgaW50IGJpdG1hcFJvd1BhZEEsCgkJICBHQm9vbCByZXZlcnNlVmlkZW9BLCBTcGxhc2hDb2xvclB0ciBwYXBlckNvbG9yQSwKCQkgIEdCb29sIGJpdG1hcFRvcERvd25BID0gZ1RydWUsCgkJICBTcGxhc2hUaGluTGluZU1vZGUgdGhpbkxpbmVNb2RlID0gc3BsYXNoVGhpbkxpbmVEZWZhdWx0LAoJCSAgR0Jvb2wgb3ZlcnByaW50UHJldmlld0EgPSBnbG9iYWxQYXJhbXMtPmdldE92ZXJwcmludFByZXZpZXcoKSk7CgogIC8vIERlc3RydWN0b3IuCiAgflNwbGFzaE91dHB1dERldigpOwoKICAvLy0tLS0tIGdldCBpbmZvIGFib3V0IG91dHB1dCBkZXZpY2UKCiAgLy8gRG9lcyB0aGlzIGRldmljZSB1c2UgdGlsaW5nUGF0dGVybkZpbGwoKT8gIElmIHRoaXMgcmV0dXJucyBmYWxzZSwKICAvLyB0aWxpbmcgcGF0dGVybiBmaWxscyB3aWxsIGJlIHJlZHVjZWQgdG8gYSBzZXJpZXMgb2Ygb3RoZXIgZHJhd2luZwogIC8vIG9wZXJhdGlvbnMuCiAgR0Jvb2wgdXNlVGlsaW5nUGF0dGVybkZpbGwoKSBvdmVycmlkZSB7IHJldHVybiBnVHJ1ZTsgfQoKICAvLyBEb2VzIHRoaXMgZGV2aWNlIHVzZSBmdW5jdGlvblNoYWRlZEZpbGwoKSwgYXhpYWxTaGFkZWRGaWxsKCksIGFuZAogIC8vIHJhZGlhbFNoYWRlZEZpbGwoKT8gIElmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlc2Ugc2hhZGVkIGZpbGxzCiAgLy8gd2lsbCBiZSByZWR1Y2VkIHRvIGEgc2VyaWVzIG9mIG90aGVyIGRyYXdpbmcgb3BlcmF0aW9ucy4KICBHQm9vbCB1c2VTaGFkZWRGaWxscyhpbnQgdHlwZSkgb3ZlcnJpZGUKICB7IHJldHVybiAodHlwZSA+PSAxICYmIHR5cGUgPD0gNSkgPyBnVHJ1ZSA6IGdGYWxzZTsgfQoKICAvLyBEb2VzIHRoaXMgZGV2aWNlIHVzZSB1cHNpZGUtZG93biBjb29yZGluYXRlcz8KICAvLyAoVXBzaWRlLWRvd24gbWVhbnMgKDAsMCkgaXMgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgcGFnZS4pCiAgR0Jvb2wgdXBzaWRlRG93bigpIG92ZXJyaWRlIHsgcmV0dXJuIGJpdG1hcFRvcERvd24gXiBiaXRtYXBVcHNpZGVEb3duOyB9CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIGRyYXdDaGFyKCkgb3IgZHJhd1N0cmluZygpPwogIEdCb29sIHVzZURyYXdDaGFyKCkgb3ZlcnJpZGUgeyByZXR1cm4gZ1RydWU7IH0KCiAgLy8gRG9lcyB0aGlzIGRldmljZSB1c2UgYmVnaW5UeXBlM0NoYXIvZW5kVHlwZTNDaGFyPyAgT3RoZXJ3aXNlLAogIC8vIHRleHQgaW4gVHlwZSAzIGZvbnRzIHdpbGwgYmUgZHJhd24gd2l0aCBkcmF3Q2hhci9kcmF3U3RyaW5nLgogIEdCb29sIGludGVycHJldFR5cGUzQ2hhcnMoKSBvdmVycmlkZSB7IHJldHVybiBnVHJ1ZTsgfQoKICAvLy0tLS0tIGluaXRpYWxpemF0aW9uIGFuZCBjb250cm9sCgogIC8vIFN0YXJ0IGEgcGFnZS4KICB2b2lkIHN0YXJ0UGFnZShpbnQgcGFnZU51bSwgR2Z4U3RhdGUgKnN0YXRlLCBYUmVmICp4cmVmKSBvdmVycmlkZTsKCiAgLy8gRW5kIGEgcGFnZS4KICB2b2lkIGVuZFBhZ2UoKSBvdmVycmlkZTsKCiAgLy8tLS0tLSBzYXZlL3Jlc3RvcmUgZ3JhcGhpY3Mgc3RhdGUKICB2b2lkIHNhdmVTdGF0ZShHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgcmVzdG9yZVN0YXRlKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CgogIC8vLS0tLS0gdXBkYXRlIGdyYXBoaWNzIHN0YXRlCiAgdm9pZCB1cGRhdGVBbGwoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZUNUTShHZnhTdGF0ZSAqc3RhdGUsIGRvdWJsZSBtMTEsIGRvdWJsZSBtMTIsCgkJCSBkb3VibGUgbTIxLCBkb3VibGUgbTIyLCBkb3VibGUgbTMxLCBkb3VibGUgbTMyKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZUxpbmVEYXNoKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVGbGF0bmVzcyhHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlTGluZUpvaW4oR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZUxpbmVDYXAoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZU1pdGVyTGltaXQoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZUxpbmVXaWR0aChHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlU3Ryb2tlQWRqdXN0KEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVGaWxsQ29sb3JTcGFjZShHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlU3Ryb2tlQ29sb3JTcGFjZShHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlRmlsbENvbG9yKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVTdHJva2VDb2xvcihHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlQmxlbmRNb2RlKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCB1cGRhdGVGaWxsT3BhY2l0eShHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlU3Ryb2tlT3BhY2l0eShHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlUGF0dGVybk9wYWNpdHkoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIGNsZWFyUGF0dGVybk9wYWNpdHkoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZUZpbGxPdmVycHJpbnQoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIHVwZGF0ZVN0cm9rZU92ZXJwcmludChHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlT3ZlcnByaW50TW9kZShHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgdXBkYXRlVHJhbnNmZXIoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKCiAgLy8tLS0tLSB1cGRhdGUgdGV4dCBzdGF0ZQogIHZvaWQgdXBkYXRlRm9udChHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwoKICAvLy0tLS0tIHBhdGggcGFpbnRpbmcKICB2b2lkIHN0cm9rZShHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgZmlsbChHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgZW9GaWxsKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgR0Jvb2wgdGlsaW5nUGF0dGVybkZpbGwoR2Z4U3RhdGUgKnN0YXRlLCBHZnggKmdmeCwgQ2F0YWxvZyAqY2F0YWxvZywgT2JqZWN0ICpzdHIsCgkJCQkgIGRvdWJsZSAqcG1hdCwgaW50IHBhaW50VHlwZSwgaW50IHRpbGluZ1R5cGUsIERpY3QgKnJlc0RpY3QsCgkJCQkgIGRvdWJsZSAqbWF0LCBkb3VibGUgKmJib3gsCgkJCQkgIGludCB4MCwgaW50IHkwLCBpbnQgeDEsIGludCB5MSwKCQkJCSAgZG91YmxlIHhTdGVwLCBkb3VibGUgeVN0ZXApIG92ZXJyaWRlOwogIEdCb29sIGZ1bmN0aW9uU2hhZGVkRmlsbChHZnhTdGF0ZSAqc3RhdGUsIEdmeEZ1bmN0aW9uU2hhZGluZyAqc2hhZGluZykgb3ZlcnJpZGU7CiAgR0Jvb2wgYXhpYWxTaGFkZWRGaWxsKEdmeFN0YXRlICpzdGF0ZSwgR2Z4QXhpYWxTaGFkaW5nICpzaGFkaW5nLCBkb3VibGUgdE1pbiwgZG91YmxlIHRNYXgpIG92ZXJyaWRlOwogIEdCb29sIHJhZGlhbFNoYWRlZEZpbGwoR2Z4U3RhdGUgKnN0YXRlLCBHZnhSYWRpYWxTaGFkaW5nICpzaGFkaW5nLCBkb3VibGUgdE1pbiwgZG91YmxlIHRNYXgpIG92ZXJyaWRlOwogIEdCb29sIGdvdXJhdWRUcmlhbmdsZVNoYWRlZEZpbGwoR2Z4U3RhdGUgKnN0YXRlLCBHZnhHb3VyYXVkVHJpYW5nbGVTaGFkaW5nICpzaGFkaW5nKSBvdmVycmlkZTsKCiAgLy8tLS0tLSBwYXRoIGNsaXBwaW5nCiAgdm9pZCBjbGlwKEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCBlb0NsaXAoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKICB2b2lkIGNsaXBUb1N0cm9rZVBhdGgoR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKCiAgLy8tLS0tLSB0ZXh0IGRyYXdpbmcKICB2b2lkIGRyYXdDaGFyKEdmeFN0YXRlICpzdGF0ZSwgZG91YmxlIHgsIGRvdWJsZSB5LAoJCQlkb3VibGUgZHgsIGRvdWJsZSBkeSwKCQkJZG91YmxlIG9yaWdpblgsIGRvdWJsZSBvcmlnaW5ZLAoJCQlDaGFyQ29kZSBjb2RlLCBpbnQgbkJ5dGVzLCBVbmljb2RlICp1LCBpbnQgdUxlbikgb3ZlcnJpZGU7CiAgR0Jvb2wgYmVnaW5UeXBlM0NoYXIoR2Z4U3RhdGUgKnN0YXRlLCBkb3VibGUgeCwgZG91YmxlIHksCgkJCSAgICAgICBkb3VibGUgZHgsIGRvdWJsZSBkeSwKCQkJICAgICAgIENoYXJDb2RlIGNvZGUsIFVuaWNvZGUgKnUsIGludCB1TGVuKSBvdmVycmlkZTsKICB2b2lkIGVuZFR5cGUzQ2hhcihHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgYmVnaW5UZXh0T2JqZWN0KEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CiAgdm9pZCBlbmRUZXh0T2JqZWN0KEdmeFN0YXRlICpzdGF0ZSkgb3ZlcnJpZGU7CgogIC8vLS0tLS0gaW1hZ2UgZHJhd2luZwogIHZvaWQgZHJhd0ltYWdlTWFzayhHZnhTdGF0ZSAqc3RhdGUsIE9iamVjdCAqcmVmLCBTdHJlYW0gKnN0ciwKCQkJICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEdCb29sIGludmVydCwKCQkJICAgICBHQm9vbCBpbnRlcnBvbGF0ZSwgR0Jvb2wgaW5saW5lSW1nKSBvdmVycmlkZTsKICB2b2lkIHNldFNvZnRNYXNrRnJvbUltYWdlTWFzayhHZnhTdGF0ZSAqc3RhdGUsCgkJCQkJT2JqZWN0ICpyZWYsIFN0cmVhbSAqc3RyLAoJCQkJCWludCB3aWR0aCwgaW50IGhlaWdodCwgR0Jvb2wgaW52ZXJ0LAoJCQkJCUdCb29sIGlubGluZUltZywgZG91YmxlICpiYXNlTWF0cml4KSBvdmVycmlkZTsKICB2b2lkIHVuc2V0U29mdE1hc2tGcm9tSW1hZ2VNYXNrKEdmeFN0YXRlICpzdGF0ZSwgZG91YmxlICpiYXNlTWF0cml4KSBvdmVycmlkZTsKICB2b2lkIGRyYXdJbWFnZShHZnhTdGF0ZSAqc3RhdGUsIE9iamVjdCAqcmVmLCBTdHJlYW0gKnN0ciwKCQkJIGludCB3aWR0aCwgaW50IGhlaWdodCwgR2Z4SW1hZ2VDb2xvck1hcCAqY29sb3JNYXAsCgkJCSBHQm9vbCBpbnRlcnBvbGF0ZSwgaW50ICptYXNrQ29sb3JzLCBHQm9vbCBpbmxpbmVJbWcpIG92ZXJyaWRlOwogIHZvaWQgZHJhd01hc2tlZEltYWdlKEdmeFN0YXRlICpzdGF0ZSwgT2JqZWN0ICpyZWYsIFN0cmVhbSAqc3RyLAoJCQkgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAoJCQkgICAgICAgR2Z4SW1hZ2VDb2xvck1hcCAqY29sb3JNYXAsCgkJCSAgICAgICBHQm9vbCBpbnRlcnBvbGF0ZSwKCQkJICAgICAgIFN0cmVhbSAqbWFza1N0ciwgaW50IG1hc2tXaWR0aCwgaW50IG1hc2tIZWlnaHQsCgkJCSAgICAgICBHQm9vbCBtYXNrSW52ZXJ0LCBHQm9vbCBtYXNrSW50ZXJwb2xhdGUpIG92ZXJyaWRlOwogIHZvaWQgZHJhd1NvZnRNYXNrZWRJbWFnZShHZnhTdGF0ZSAqc3RhdGUsIE9iamVjdCAqcmVmLCBTdHJlYW0gKnN0ciwKCQkJCSAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKCQkJCSAgIEdmeEltYWdlQ29sb3JNYXAgKmNvbG9yTWFwLAoJCQkJICAgR0Jvb2wgaW50ZXJwb2xhdGUsCgkJCQkgICBTdHJlYW0gKm1hc2tTdHIsCgkJCQkgICBpbnQgbWFza1dpZHRoLCBpbnQgbWFza0hlaWdodCwKCQkJCSAgIEdmeEltYWdlQ29sb3JNYXAgKm1hc2tDb2xvck1hcCwKCQkJCSAgIEdCb29sIG1hc2tJbnRlcnBvbGF0ZSkgb3ZlcnJpZGU7CgogIC8vLS0tLS0gVHlwZSAzIGZvbnQgb3BlcmF0b3JzCiAgdm9pZCB0eXBlM0QwKEdmeFN0YXRlICpzdGF0ZSwgZG91YmxlIHd4LCBkb3VibGUgd3kpIG92ZXJyaWRlOwogIHZvaWQgdHlwZTNEMShHZnhTdGF0ZSAqc3RhdGUsIGRvdWJsZSB3eCwgZG91YmxlIHd5LAoJCSAgICAgICBkb3VibGUgbGx4LCBkb3VibGUgbGx5LCBkb3VibGUgdXJ4LCBkb3VibGUgdXJ5KSBvdmVycmlkZTsKCiAgLy8tLS0tLSB0cmFuc3BhcmVuY3kgZ3JvdXBzIGFuZCBzb2Z0IG1hc2tzCiAgR0Jvb2wgY2hlY2tUcmFuc3BhcmVuY3lHcm91cChHZnhTdGF0ZSAqc3RhdGUsIEdCb29sIGtub2Nrb3V0KSBvdmVycmlkZTsKICB2b2lkIGJlZ2luVHJhbnNwYXJlbmN5R3JvdXAoR2Z4U3RhdGUgKnN0YXRlLCBkb3VibGUgKmJib3gsCgkJCQkgICAgICBHZnhDb2xvclNwYWNlICpibGVuZGluZ0NvbG9yU3BhY2UsCgkJCQkgICAgICBHQm9vbCBpc29sYXRlZCwgR0Jvb2wga25vY2tvdXQsCgkJCQkgICAgICBHQm9vbCBmb3JTb2Z0TWFzaykgb3ZlcnJpZGU7CiAgdm9pZCBlbmRUcmFuc3BhcmVuY3lHcm91cChHZnhTdGF0ZSAqc3RhdGUpIG92ZXJyaWRlOwogIHZvaWQgcGFpbnRUcmFuc3BhcmVuY3lHcm91cChHZnhTdGF0ZSAqc3RhdGUsIGRvdWJsZSAqYmJveCkgb3ZlcnJpZGU7CiAgdm9pZCBzZXRTb2Z0TWFzayhHZnhTdGF0ZSAqc3RhdGUsIGRvdWJsZSAqYmJveCwgR0Jvb2wgYWxwaGEsCgkJCSAgIEZ1bmN0aW9uICp0cmFuc2ZlckZ1bmMsIEdmeENvbG9yICpiYWNrZHJvcENvbG9yKSBvdmVycmlkZTsKICB2b2lkIGNsZWFyU29mdE1hc2soR2Z4U3RhdGUgKnN0YXRlKSBvdmVycmlkZTsKCiAgLy8tLS0tLSBzcGVjaWFsIGFjY2VzcwoKICAvLyBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCBhIG5ldyBQREYgZG9jdW1lbnQgaGFzIGJlZW4gbG9hZGVkLgogIHZvaWQgc3RhcnREb2MoUERGRG9jICpkb2NBKTsKIAogIHZvaWQgc2V0UGFwZXJDb2xvcihTcGxhc2hDb2xvclB0ciBwYXBlckNvbG9yQSk7CgogIEdCb29sIGlzUmV2ZXJzZVZpZGVvKCkgeyByZXR1cm4gcmV2ZXJzZVZpZGVvOyB9CiAgdm9pZCBzZXRSZXZlcnNlVmlkZW8oR0Jvb2wgcmV2ZXJzZVZpZGVvQSkgeyByZXZlcnNlVmlkZW8gPSByZXZlcnNlVmlkZW9BOyB9CgogIC8vIEdldCB0aGUgYml0bWFwIGFuZCBpdHMgc2l6ZS4KICBTcGxhc2hCaXRtYXAgKmdldEJpdG1hcCgpIHsgcmV0dXJuIGJpdG1hcDsgfQogIGludCBnZXRCaXRtYXBXaWR0aCgpOwogIGludCBnZXRCaXRtYXBIZWlnaHQoKTsKCiAgLy8gUmV0dXJucyB0aGUgbGFzdCByYXN0ZXJpemVkIGJpdG1hcCwgdHJhbnNmZXJyaW5nIG93bmVyc2hpcCB0byB0aGUKICAvLyBjYWxsZXIuCiAgU3BsYXNoQml0bWFwICp0YWtlQml0bWFwKCk7CgogIC8vIFNldCB0aGlzIGZsYWcgdG8gdHJ1ZSB0byBnZW5lcmF0ZSBhbiB1cHNpZGUtZG93biBiaXRtYXAgKHVzZWZ1bAogIC8vIGZvciBXaW5kb3dzIEJNUCBmaWxlcykuCiAgdm9pZCBzZXRCaXRtYXBVcHNpZGVEb3duKEdCb29sIGYpIHsgYml0bWFwVXBzaWRlRG93biA9IGY7IH0KCiAgLy8gR2V0IHRoZSBTcGxhc2ggb2JqZWN0LgogIFNwbGFzaCAqZ2V0U3BsYXNoKCkgeyByZXR1cm4gc3BsYXNoOyB9CgogIC8vIEdldCB0aGUgbW9kaWZpZWQgcmVnaW9uLgogIHZvaWQgZ2V0TW9kUmVnaW9uKGludCAqeE1pbiwgaW50ICp5TWluLCBpbnQgKnhNYXgsIGludCAqeU1heCk7CgogIC8vIENsZWFyIHRoZSBtb2RpZmllZCByZWdpb24uCiAgdm9pZCBjbGVhck1vZFJlZ2lvbigpOwoKICBTcGxhc2hGb250ICpnZXRDdXJyZW50Rm9udCgpIHsgcmV0dXJuIGZvbnQ7IH0KCiAgLy8gSWYgPHNraXBUZXh0QT4gaXMgdHJ1ZSwgZG9uJ3QgZHJhdyBob3Jpem9udGFsIHRleHQuCiAgLy8gSWYgPHNraXBSb3RhdGVkVGV4dEE+IGlzIHRydWUsIGRvbid0IGRyYXcgcm90YXRlZCAobm9uLWhvcml6b250YWwpIHRleHQuCiAgdm9pZCBzZXRTa2lwVGV4dChHQm9vbCBza2lwSG9yaXpUZXh0QSwgR0Jvb2wgc2tpcFJvdGF0ZWRUZXh0QSkKICAgIHsgc2tpcEhvcml6VGV4dCA9IHNraXBIb3JpelRleHRBOyBza2lwUm90YXRlZFRleHQgPSBza2lwUm90YXRlZFRleHRBOyB9CgogIGludCBnZXROZXN0Q291bnQoKSB7IHJldHVybiBuZXN0Q291bnQ7IH0KCiNpZiAxIC8vfnRtcDogdHVybiBvZmYgYW50aS1hbGlhc2luZyB0ZW1wb3JhcmlseQogIEdCb29sIGdldFZlY3RvckFudGlhbGlhcygpIG92ZXJyaWRlOwogIHZvaWQgc2V0VmVjdG9yQW50aWFsaWFzKEdCb29sIHZhYSkgb3ZlcnJpZGU7CiNlbmRpZgoKICBHQm9vbCBnZXRGb250QW50aWFsaWFzKCkgeyByZXR1cm4gZm9udEFudGlhbGlhczsgfQogIHZvaWQgc2V0Rm9udEFudGlhbGlhcyhHQm9vbCBhbnRpKSB7IGZvbnRBbnRpYWxpYXMgPSBhbnRpOyB9CgogIHZvaWQgc2V0RnJlZVR5cGVIaW50aW5nKEdCb29sIGVuYWJsZSwgR0Jvb2wgZW5hYmxlU2xpZ2h0SGludGluZyk7Cgpwcm90ZWN0ZWQ6CiAgdm9pZCBkb1VwZGF0ZUZvbnQoR2Z4U3RhdGUgKnN0YXRlKTsKCnByaXZhdGU6CiAgR0Jvb2wgdW5pdmFyaWF0ZVNoYWRlZEZpbGwoR2Z4U3RhdGUgKnN0YXRlLCBTcGxhc2hVbml2YXJpYXRlUGF0dGVybiAqcGF0dGVybiwgZG91YmxlIHRNaW4sIGRvdWJsZSB0TWF4KTsKCiAgdm9pZCBzZXR1cFNjcmVlblBhcmFtcyhkb3VibGUgaERQSSwgZG91YmxlIHZEUEkpOwogIFNwbGFzaFBhdHRlcm4gKmdldENvbG9yKEdmeEdyYXkgZ3JheSk7CiAgU3BsYXNoUGF0dGVybiAqZ2V0Q29sb3IoR2Z4UkdCICpyZ2IpOwojaWZkZWYgU1BMQVNIX0NNWUsKICBTcGxhc2hQYXR0ZXJuICpnZXRDb2xvcihHZnhDTVlLICpjbXlrKTsKICBTcGxhc2hQYXR0ZXJuICpnZXRDb2xvcihHZnhDb2xvciAqZGV2aWNlTik7CiNlbmRpZgogIHZvaWQgZ2V0TWF0dGVDb2xvciggU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZSwgR2Z4SW1hZ2VDb2xvck1hcCAqY29sb3JNYXAsIEdmeENvbG9yICogbWF0dGVDb2xvciwgU3BsYXNoQ29sb3Igc3BsYXNoTWF0dGVDb2xvcik7CiAgdm9pZCBzZXRPdmVycHJpbnRNYXNrKEdmeENvbG9yU3BhY2UgKmNvbG9yU3BhY2UsIEdCb29sIG92ZXJwcmludEZsYWcsCgkJCWludCBvdmVycHJpbnRNb2RlLCBHZnhDb2xvciAqc2luZ2xlQ29sb3IsIEdCb29sIGdyYXlJbmRleGVkID0gZ0ZhbHNlKTsKICBTcGxhc2hQYXRoICpjb252ZXJ0UGF0aChHZnhTdGF0ZSAqc3RhdGUsIEdmeFBhdGggKnBhdGgsCgkJCSAgR0Jvb2wgZHJvcEVtcHR5U3VicGF0aHMpOwogIHZvaWQgZHJhd1R5cGUzR2x5cGgoR2Z4U3RhdGUgKnN0YXRlLCBUM0ZvbnRDYWNoZSAqdDNGb250LAoJCSAgICAgIFQzRm9udENhY2hlVGFnICp0YWcsIEd1Y2hhciAqZGF0YSk7CiNpZmRlZiBVU0VfQ01TCiAgR0Jvb2wgdXNlSWNjSW1hZ2VTcmModm9pZCAqZGF0YSk7CiAgc3RhdGljIHZvaWQgaWNjVHJhbnNmb3JtKHZvaWQgKmRhdGEsIFNwbGFzaEJpdG1hcCAqYml0bWFwKTsKICBzdGF0aWMgR0Jvb2wgaWNjSW1hZ2VTcmModm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgY29sb3JMaW5lLAoJCQlHdWNoYXIgKmFscGhhTGluZSk7CiNlbmRpZgogIHN0YXRpYyBHQm9vbCBpbWFnZU1hc2tTcmModm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgbGluZSk7CiAgc3RhdGljIEdCb29sIGltYWdlU3JjKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIGNvbG9yTGluZSwKCQkJR3VjaGFyICphbHBoYUxpbmUpOwogIHN0YXRpYyBHQm9vbCBhbHBoYUltYWdlU3JjKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIGxpbmUsCgkJCSAgICAgR3VjaGFyICphbHBoYUxpbmUpOwogIHN0YXRpYyBHQm9vbCBtYXNrZWRJbWFnZVNyYyh2b2lkICpkYXRhLCBTcGxhc2hDb2xvclB0ciBsaW5lLAoJCQkgICAgICBHdWNoYXIgKmFscGhhTGluZSk7CiAgc3RhdGljIEdCb29sIHRpbGluZ0JpdG1hcFNyYyh2b2lkICpkYXRhLCBTcGxhc2hDb2xvclB0ciBsaW5lLAoJCQkgICAgIEd1Y2hhciAqYWxwaGFMaW5lKTsKCiAgR0Jvb2wga2VlcEFscGhhQ2hhbm5lbDsJLy8gZG9uJ3QgZmlsbCB3aXRoIHBhcGVyIGNvbG9yLCBrZWVwIGFscGhhIGNoYW5uZWwKCiAgU3BsYXNoQ29sb3JNb2RlIGNvbG9yTW9kZTsKICBpbnQgYml0bWFwUm93UGFkOwogIEdCb29sIGJpdG1hcFRvcERvd247CiAgR0Jvb2wgYml0bWFwVXBzaWRlRG93bjsKICBHQm9vbCBmb250QW50aWFsaWFzOwogIEdCb29sIHZlY3RvckFudGlhbGlhczsKICBHQm9vbCBvdmVycHJpbnRQcmV2aWV3OwogIEdCb29sIGVuYWJsZUZyZWVUeXBlSGludGluZzsKICBHQm9vbCBlbmFibGVTbGlnaHRIaW50aW5nOwogIEdCb29sIHJldmVyc2VWaWRlbzsJCS8vIHJldmVyc2UgdmlkZW8gbW9kZQogIFNwbGFzaENvbG9yIHBhcGVyQ29sb3I7CS8vIHBhcGVyIGNvbG9yCiAgU3BsYXNoU2NyZWVuUGFyYW1zIHNjcmVlblBhcmFtczsKICBHQm9vbCBza2lwSG9yaXpUZXh0OwogIEdCb29sIHNraXBSb3RhdGVkVGV4dDsKCiAgUERGRG9jICpkb2M7CQkJLy8gdGhlIGN1cnJlbnQgZG9jdW1lbnQKICBYUmVmICp4cmVmOyAgICAgICAvLyB0aGUgeHJlZiBvZiB0aGUgY3VycmVudCBkb2N1bWVudAoKICBTcGxhc2hCaXRtYXAgKmJpdG1hcDsKICBTcGxhc2ggKnNwbGFzaDsKICBTcGxhc2hGb250RW5naW5lICpmb250RW5naW5lOwoKICBUM0ZvbnRDYWNoZSAqCQkJLy8gVHlwZSAzIGZvbnQgY2FjaGUKICAgIHQzRm9udENhY2hlW3NwbGFzaE91dFQzRm9udENhY2hlU2l6ZV07CiAgaW50IG5UM0ZvbnRzOwkJCS8vIG51bWJlciBvZiB2YWxpZCBlbnRyaWVzIGluIHQzRm9udENhY2hlCiAgVDNHbHlwaFN0YWNrICp0M0dseXBoU3RhY2s7CS8vIFR5cGUgMyBnbHlwaCBjb250ZXh0IHN0YWNrCgogIFNwbGFzaEZvbnQgKmZvbnQ7CQkvLyBjdXJyZW50IGZvbnQKICBHQm9vbCBuZWVkRm9udFVwZGF0ZTsJCS8vIHNldCB3aGVuIHRoZSBmb250IG5lZWRzIHRvIGJlIHVwZGF0ZWQKICBTcGxhc2hQYXRoICp0ZXh0Q2xpcFBhdGg7CS8vIGNsaXBwaW5nIHBhdGggYnVpbHQgd2l0aCB0ZXh0IG9iamVjdAoKICBTcGxhc2hUcmFuc3BhcmVuY3lHcm91cCAqCS8vIHRyYW5zcGFyZW5jeSBncm91cCBzdGFjawogICAgdHJhbnNwR3JvdXBTdGFjazsKICBTcGxhc2hCaXRtYXAgKm1hc2tCaXRtYXA7IC8vIGZvciBpbWFnZSBtYXNrcyBpbiBwYXR0ZXJuIGNvbG9yc3BhY2UKICBpbnQgbmVzdENvdW50Owp9OwoKI2VuZGlmCg==