LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KICoKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCiAqIGNvcGllcy4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAogKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCiAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgovKgogKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCiAqLwoKCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgogICAgICAgICAgICAgICAgICAgICAgIFcgTCBBIE4gXyBRIEMgVCBfIFQgTCAuIEMKCiAgT1ZFUlZJRVc6CgogIFRoaXMgc29mdHdhcmUgdW5pdCBob2xkcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdMQU4gVHJhbnNwb3J0IExheWVyLgoKICBUaGUgZnVuY3Rpb25zIGV4dGVybmFsaXplZCBieSB0aGlzIG1vZHVsZSBhcmUgdG8gYmUgY2FsbGVkIE9OTFkgYnkgb3RoZXIKICBXTEFOIG1vZHVsZXMgdGhhdCBwcm9wZXJseSByZWdpc3RlciB3aXRoIHRoZSBUcmFuc3BvcnQgTGF5ZXIgaW5pdGlhbGx5LgoKICBERVBFTkRFTkNJRVM6CgogIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgoKCiAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4KICBBbGwgUmlnaHRzIFJlc2VydmVkLgogIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCgoKICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgoKCiAgICRIZWFkZXIkJERhdGVUaW1lJCRBdXRob3IkCgoKICB3aGVuICAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKLS0tLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMjAxMC0wNy0xMyAgICBjX3NoaW5kZSBGaXhlZCBhbiBpc3N1ZSB3aGVyZSBXQVBJIHJla2V5aW5nIHdhcyBmYWlsaW5nIGJlY2F1c2UgCiAgICAgICAgICAgICAgICAgICAgICBXQUkgZnJhbWUgc2VudCBvdXQgZHVyaW5nIHJla2V5aW5nIGhhZCB0aGUgcHJvdGVjdGVkIGJpdAogICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIDEuCjIwMTAtMDUtMDYgICAgcm5haXIgICBDaGFuZ2VkIG5hbWUgb2YgdmFyaWFibGUgZnJvbSB1c0xsY1R5cGUgdG8gdXNFdGhlclR5cGUKICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWQgZnVuY3Rpb24gbmFtZSBmcm9tIEdldExMQ1R5cGUgdG8gR2V0RXRoZXJUeXBlCiAgICAgICAgICAgICAgICAgICAgICBGaXhlZCA4MDIuMyB0byA4MDIuMTEgZnJhbWUgdHJhbnNsYXRpb24gaXNzdWUgd2hlcmUgdHdvIAogICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgb2YgdGhlIExMQyBoZWFkZXIgd2FzIGdldHRpbmcgb3ZlcndyaXR0ZW4gaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICBub24tUW9zIHBhdGgKMjAxMC0wNS0wNiAgICBybmFpciAgIFJ4QXV0aCBwYXRoIGZpeCBmb3IgbW9kaWZ5aW5nIHRoZSBoZWFkZXIgYmVmb3JlIGV0aGVyCiAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIHJldHJlaXZlZCAoRGV0ZWN0ZWQgd2hpbGUgdGVzdGluZyByZWtleWluZwogICAgICAgICAgICAgICAgICAgICAgaW4gV0FQSSBWb2xhbnMpCjIwMTAtMDItMTkgICAgYmFkICAgICBGaXhlZCA4MDIuMTEgdG8gODAyLjMgZnQgaXNzdWVzIHdpdGggV0FQSQoyMDEwLTAyLTE5ICAgIHJuYWlyICAgV0FQSTogSWYgZnJhbWUgaXMgYSBXQUkgZnJhbWUgaW4gVHhDb25uIGFuZCBUeEF1dGgsIFRMIAogICAgICAgICAgICAgICAgICAgICAgZG9lcyBmcmFtZSB0cmFuc2xhdGlvbi4gCjIwMTAtMDItMDEgICAgcm5haXIgICBXQVBJOiBGaXhlZCBhIGJ1ZyB3aGVyZSB0aGUgdmFsdWUgb2YgdWNJc1dhcGlTdGEgd2FzIG5vdCAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHNldCBpbiB0aGUgVEwgY29udHJvbCBibG9jayBpbiB0aGUgUmVnaXN0ZXJTVEEgZnVuYy4gCjIwMTAtMDEtMDggICAgbHRpICAgICBBZGRlZCBUTCBEYXRhIENhY2hpbmcgCjIwMDktMTEtMDQgICAgcm5haXIgICBXQVBJOiBNb3ZpbmcgY29tbW9uIGZ1bmN0aW9uYWxpdHkgdG8gYSBzZXBlcmF0ZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIFdMQU5UTF9HZXRMTENUeXBlCjIwMDktMTAtMTUgICAgcm5haXIgICBXQVBJOiBGZWF0dXJpemluZyBXQVBJIGNvZGUKMjAwOS0xMC0wOSAgICBybmFpciAgIFdBUEk6IE1vZGlmaWNhdGlvbnMgdG8gYXV0aGVudGljYXRlZCBzdGF0ZSBoYW5kbGluZyBvZiBSeCBkYXRhCjIwMDktMTAtMDYgICAgcm5haXIgICBBZGRpbmcgc3VwcG9ydCBmb3IgV0FQSSAKMjAwOS0wOS0yMiAgICBsdGkgICAgIEFkZCBkZXJlZ2lzdHJhdGlvbiBBUEkgZm9yIG1hbmFnZW1lbnQgY2xpZW50CjIwMDktMDctMTYgICAgcm5haXIgICBUZW1wb3JhcnkgZml4IHRvIGxldCBUTCBmZXRjaCBwYWNrZXRzIHdoZW4gbXVsdGlwbGUgCiAgICAgICAgICAgICAgICAgICAgICBwZWVycyBleGlzdCBpbiBhbiBJQlNTCjIwMDktMDYtMTAgICAgbHRpICAgICBGaXggZm9yIGNoZWNraW5nIFRJRCB2YWx1ZSBvZiBtZXRhIGluZm8gb24gVFggLSBwcmV2ZW50CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgb3ZlcndyaXRlIAogICAgICAgICAgICAgICAgICAgICAgRml4IGZvciBwcm9wZXJseSBjaGVja2luZyB0aGUgc3RhIGlkIGZvciByZXN1bWluZyB0cmlnZ2VyCiAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBnZW5lcmF0aW9uCjIwMDktMDUtMTQgICAgbHRpICAgICBGaXggZm9yIHNlbmRpbmcgb3V0IHRyaWdnZXIgZnJhbWVzCjIwMDktMDUtMTUgICAgbHRpICAgICBBZGRyMyBmaWx0ZXJpbmcgCjIwMDktMDQtMTMgICAgbHRpICAgICBBc3NlcnQgaWYgcGFja2V0IGxhcmdlciB0aGVuIGFsbG93ZWQKICAgICAgICAgICAgICAgICAgICAgIERyb3AgcGFja2V0IHRoYXQgZmFpbHMgZmxhdHRlbgoyMDA5LTA0LTAyICAgIGx0aSAgICAgUGVyZm9ybWFuY2UgZml4ZXMgZm9yIFRMIAoyMDA5LTAyLTE5ICAgIGx0aSAgICAgQWRkZWQgZml4IGZvciBMTEMgbWFuYWdlbWVudCBvbiBSeCBDb25uZWN0IAoyMDA5LTAxLTE2ICAgIGx0aSAgICAgUmVwbGFjZWQgcGVlayBkYXRhIHdpdGggZXh0cmFjdCBkYXRhIGZvciBub24gQkQgb3BlcnRpb25zCiAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0ZWQgZnJhbWUgY29udHJvbCBpbiBUbCBhbmQgcGFzcyB0byBIQUwgZm9yIGZyYW1lIAogICAgICAgICAgICAgICAgICAgICAgdHlwZSBldmFsdWF0aW9uCjIwMDktMDItMDIgICAgc2NoICAgICBBZGQgaGFuZG9mZiBzdXBwb3J0CjIwMDgtMTItMDkgICAgbHRpICAgICBGaXhlcyBmb3IgQU1TUyBjb21waWxhdGlvbiAKICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgYXNzZXJ0IG9uIHJlY2VpdmUgd2hlbiB0aGVyZSBpcyBubyBzdGF0aW9uCjIwMDgtMTItMDIgICAgbHRpICAgICBGaXggZm8gdHJpZ2dlciBmcmFtZSBnZW5lcmF0aW9uIAoyMDA4LTEwLTMxICAgIGx0aSAgICAgRml4IGZvIFRMIHR4IHN1c3BlbmQKMjAwOC0xMC0wMSAgICBsdGkgICAgIE1lcmdlZCBpbiBmaXhlcyBmcm9tIHJlb3JkZXJpbmcKICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVkIHBhcnQgb2YgVUFQU0QgZnVuY3Rpb25hbGl0eSBpbiBUTAogICAgICAgICAgICAgICAgICAgICAgKHdpbGwgYmUgcmUtZW5hYmxlZCBvbmNlIFVBUFNEIGlzIHRlc3RlZCkKICAgICAgICAgICAgICAgICAgICAgIEZpeCBmb3IgVUFQU0QgbXVsdGlwbGUgZW5hYmxlCjIwMDgtMDgtMTAgICAgbHRpICAgICBGaXhlcyBmb2xsb3dpbmcgVUFQU0QgdGVzdGluZwogICAgICAgICAgICAgICAgICAgICAgRml4ZWQgaW5maW5pdGUgbG9vcCBvbiBtYXNrIGNvbXB1dGF0aW9uIHdoZW4gU1RBIG5vIHJlZwoyMDA4LTA4LTA2ICAgIGx0aSAgICAgRml4ZXMgYWZ0ZXIgUU9TIHVuaXQgdGVzdGluZwoyMDA4LTA4LTA2ICAgIGx0aSAgICAgQWRkZWQgUU9TIHN1cHBvcnQKMjAwOC0wNy0yMyAgICBsdGkgICAgIEZpeCBmb3Igdm9zIHBhY2tldCBkcmFpbmluZwoyMDA4LTA3LTE3ICAgIGx0aSAgICAgRml4IGZvciBkYXRhIHR5cGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGZyYW1lIHRyYW5zbGF0aW9uIGNvZGUgaW4gVEwKICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHJldHVybmluZyBmYWlsdXJlIHRvIFBFIGluIGNhc2UgcHJldmlvdXMgZnJhbWUgaXMKICAgICAgICAgICAgICAgICAgICAgIHN0aWxsIHBlbmRpbmc7IGZhaWwgcHJldmlvdXMgYW5kIGNhY2hlIG5ldyBvbmUgZm9yIHR4CiAgICAgICAgICAgICAgICAgICAgICBHZXQgZnJhbWVzIHJldHVybmluZyBib29sZWFuIHRydWUgaWYgbW9yZSBmcmFtZXMgYXJlIHBlbmRpbmcKMjAwOC0wNy0wMyAgICBsdGkgICAgIEZpeGVzIGZvbGxvd2luZyBwcmUtaW50ZWdyYXRpb24gdGVzdGluZwoyMDA4LTA2LTI2ICAgIGx0aSAgICAgRml4ZXMgZm9sbG93aW5nIHVuaXQgdGVzdGluZwogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgYWxsb2MgYW5kIGZyZWUgZm9yIFRMIGNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgIFVzaW5nIGF0b21pYyBzZXQgdTggaW5zdGVhZCBvZiB1MzIKMjAwOC0wNS0xNiAgICBsdGkgICAgIENyZWF0ZWQgbW9kdWxlCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEluY2x1ZGUgRmlsZXMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3dkYS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsaS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsaV9iYS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsX2hvc3VwcG9ydC5oIgojaW5jbHVkZSAidm9zX3R5cGVzLmgiCiNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKI2luY2x1ZGUgIndsYW5fcWN0X3RsX3RyYWNlLmgiCiNpbmNsdWRlICJ0bERlYnVnLmgiCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQovKkluY2x1ZGVkIHRvIGFjY2VzcyBXRElfUnhCZFR5cGUgKi8KI2luY2x1ZGUgIndsYW5fcWN0X3dkaV9iZC5oIgojZW5kaWYKLypFbmFibGVzIGRlYnVnZ2luZyBiZWhhdmlvciBpbiBUTCovCiNkZWZpbmUgVExfREVCVUcKLypFbmFibGVzIGRlYnVnZ2luZyBGQyBjb250cm9sIGZyYW1lIGluIFRMKi8KLy8jZGVmaW5lIFRMX0RFQlVHX0ZDCi8vI2RlZmluZSBXTEFOX1NPRlRBUF9GTE9XQ1RSTF9FTgovLyNkZWZpbmUgQlRBTVBfVEVTVAojaWZkZWYgVExfREVCVUdfRkMKI2luY2x1ZGUgPHdsYW5fcWN0X3BhbF9zdGF0dXMuaD4KI2luY2x1ZGUgPHdsYW5fcWN0X3BhbF9kZXZpY2UuaD4gLy8gd3BhbFJlYWRSZWdpc3RlcgojZW5kaWYKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLypMTEMgaGVhZGVyIHZhbHVlKi8Kc3RhdGljIHZfVThfdCBXTEFOVExfTExDX0hFQURFUltdID0gIHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLCAweDAwIH07CgojaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQovKkFpcm9uZXQgU05BUCBoZWFkZXIgdmFsdWUqLwpzdGF0aWMgdl9VOF90IFdMQU5UTF9BSVJPTkVUX1NOQVBfSEVBREVSW10gPSAgezB4QUEsIDB4QUEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDAgfTsKI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0VTRQoKLypCVC1BTVAgcGFja2V0IExMQyBPVUkgdmFsdWUqLwpjb25zdCB2X1U4X3QgV0xBTlRMX0JUX0FNUF9PVUlbXSA9ICB7MHgwMCwgMHgxOSwgMHg1OCB9OwoKI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCmV4dGVybiBjb25zdCB2X1U4X3QgIFdMQU5UTF9USURfMl9BQ1tXTEFOX01BWF9USURdOwoKI2VuZGlmCgojZGVmaW5lIFdMQU5UTF9NQVhfU05SX0RBVEFfU0FNUExFUyAyMAoKI2lmZGVmIFZPTEFOU19QRVJGCiNkZWZpbmUgV0xBTlRMX0JEX1BEVV9JTlRFUlJVUFRfRU5BQkxFX1RIUkVTSE9MRCAgMTIwCiNkZWZpbmUgV0xBTlRMX0JEX1BEVV9JTlRFUlJVUFRfR0VUX1RIUkVTSE9MRCAgMTIwCgovKiBUTCBCRC9QRFUgdGhyZXNob2xkIHRvIGVuYWJsZSBpbnRlcnJ1cHQgKi8KaW50IGJkUGR1SW50ZXJydXB0RW5hYmxlVGhyZXNob2xkID0gV0xBTlRMX0JEX1BEVV9JTlRFUlJVUFRfRU5BQkxFX1RIUkVTSE9MRDsKaW50IGJkUGR1SW50ZXJydXB0R2V0VGhyZXNob2xkID0gV0xBTlRMX0JEX1BEVV9JTlRFUlJVUFRfR0VUX1RIUkVTSE9MRDsKI2VuZGlmIC8qIFZPTEFOU19QRVJGICovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgogfCAgIFR5cGUoMmIpICAgfCAgICAgU3ViLXR5cGUoNGIpICAgfAogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2RlZmluZSBXTEFOVExfSVNfREFUQV9GUkFNRShfdHlwZV9zdWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgKCBXTEFOVExfREFUQV9GUkFNRV9UWVBFID09ICggKF90eXBlX3N1YikgJiAweDMwICkpCgojZGVmaW5lIFdMQU5UTF9JU19RT1NfREFUQV9GUkFNRShfdHlwZV9zdWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICgoIFdMQU5UTF9EQVRBX0ZSQU1FX1RZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4MzAgKSkgJiYgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICggV0xBTlRMXzgwMjExX0RBVEFfUU9TX1NVQlRZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4RiApKSkgCgojZGVmaW5lIFdMQU5UTF9JU19NR01UX0ZSQU1FKF90eXBlX3N1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAoIFdMQU5UTF9NR01UX0ZSQU1FX1RZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4MzAgKSkKCiNkZWZpbmUgV0xBTlRMX0lTX01HTVRfQUNUSU9OX0ZSQU1FKF90eXBlX3N1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICgoIFdMQU5UTF9NR01UX0ZSQU1FX1RZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4MzAgKSkgJiYgICAgXAogICAgICggKCBXTEFOVExfODAyMTFfTUdNVF9BQ1RJT05fU1VCVFlQRSA9PSAoIChfdHlwZV9zdWIpICYgMHhGICkpIHx8IFwKICAgICAgICggV0xBTlRMXzgwMjExX01HTVRfQUNUSU9OX05PX0FDS19TVUJUWVBFID09ICggKF90eXBlX3N1YikgJiAweEYgKSkpKQoKI2RlZmluZSBXTEFOVExfSVNfUFJPQkVfUkVRKF90eXBlX3N1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAoIFdMQU5UTF9NR01UX1BST0JFX1JFUV9GUkFNRV9UWVBFID09ICggKF90eXBlX3N1YikgJiAweDNGICkpCgojZGVmaW5lIFdMQU5UTF9JU19DVFJMX0ZSQU1FKF90eXBlX3N1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAoIFdMQU5UTF9DVFJMX0ZSQU1FX1RZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4MzAgKSkKCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwojZGVmaW5lIFdMQU5UTF9JU19URExTX0ZSQU1FKF9ldGhfdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAoIFdMQU5UTF9MTENfVERMU19UWVBFID09ICggX2V0aF90eXBlKSkKI2VuZGlmCgovKk1BWCBBbGxvd2VkIGxlbiBwcm9jZXNzZWQgYnkgVEwgLSBNQXggTVRVICsgODAyLjMgaGVhZGVyICsgQkQrRFhFK1hUTCovCiNkZWZpbmUgV0xBTlRMX01BWF9BTExPV0VEX0xFTiAgICAoMTUxNCArIDEwMCkKCiNkZWZpbmUgV0xBTlRMX01BU0tfQUMgIDB4MDMKCi8vc29tZSBmbG93X2NvbnRyb2wgZGVmaW5lCi8vTFdNIG1vZGUgd2lsbCBiZSBlbmFibGVkIGZvciB0aGlzIHN0YXRpb24gaWYgdGhlIGVncmVzcy9pbmdyZXNzIGZhbGxzIGJlbG93IHRoaXMgcmF0aW8KI2RlZmluZSBXTEFOVExfTFdNX0VHUkVTU19JTkdSRVNTX1RIUkVTSE9MRCAoMC43NSkKCi8vR2V0IGVub3VnaCBzYW1wbGUgdG8gZG8gdGhlIExXTSByZWxhdGVkIGNhbGN1bGF0aW9uCiNkZWZpbmUgV0xBTlRMX0xXTV9JTkdSRVNTX1NBTVBMRV9USFJFU0hPTEQgKDY0KQoKLy9NYXhpbWFsIG9uLWZseSBwYWNrZXQgcGVyIHN0YXRpb24gaW4gTFdNIG1vZGUKI2RlZmluZSBXTEFOVExfU1RBX0JNVV9USFJFU0hPTERfTUFYICgyNTYpCgojZGVmaW5lIFdMQU5UTF9BQ19NQVNLICgweDcpCiNkZWZpbmUgV0xBTlRMX1NUQUlEX09GRlNFVCAoMHg2KQoKLyogVUlOVDMyIHR5cGUgZW5kaWFuIHN3YXAgKi8KI2RlZmluZSBTV0FQX0VORElBTl9VSU5UMzIoYSkgICAgICAgICAgKChhKSA9ICgoYSkgPj4gMHgxOCApIHwoKChhKSAmIDB4RkYwMDAwKSA+PiAweDA4KSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChhKSAmIDB4RkYwMCkgPDwgMHgwOCkgIHwgKCgoYSkgJiAweEZGKSA8PCAweDE4KSkKCi8qIE1heGltdW0gdmFsdWUgb2YgU05SIHRoYXQgY2FuIGJlIGNhbGN1bGF0ZWQgYnkgdGhlIEhXICovCiNkZWZpbmUgV0xBTlRMX01BWF9IV19TTlIgMzUKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBUeXBlIERlY2xhcmF0aW9ucwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2RlZmluZSBUTF9MSVRUTEVfQklUX0VORElBTgoKdHlwZWRlZiBzdHJ1Y3QKewoKCiAgIHZfVThfdCBwcm90VmVyIDoyOwogICB2X1U4X3QgdHlwZSA6MjsKICAgdl9VOF90IHN1YlR5cGUgOjQ7CgogICB2X1U4X3QgdG9EUyA6MTsKICAgdl9VOF90IGZyb21EUyA6MTsKICAgdl9VOF90IG1vcmVGcmFnIDoxOwogICB2X1U4X3QgcmV0cnkgOjE7CiAgIHZfVThfdCBwb3dlck1nbXQgOjE7CiAgIHZfVThfdCBtb3JlRGF0YSA6MTsKICAgdl9VOF90IHdlcCA6MTsKICAgdl9VOF90IG9yZGVyIDoxOwoKCn0gV0xBTlRMX01BQ0ZDVHlwZTsKCi8qIDgwMi4xMSBoZWFkZXIgKi8KdHlwZWRlZiBzdHJ1Y3QKewogLyogRnJhbWUgY29udHJvbCBmaWVsZCAqLwogV0xBTlRMX01BQ0ZDVHlwZSAgd0ZybUN0cmw7CgogLyogRHVyYXRpb24gSUQgKi8KIHZfVTE2X3QgIHVzRHVyYXRpb25JZDsKCiAvKiBBZGRyZXNzIDEgZmllbGQgICovCiB2X1U4X3QgICB2QTFbVk9TX01BQ19BRERSX1NJWkVdOwoKIC8qIEFkZHJlc3MgMiBmaWVsZCAqLwogdl9VOF90ICAgdkEyW1ZPU19NQUNfQUREUl9TSVpFXTsKCiAvKiBBZGRyZXNzIDMgZmllbGQgKi8KIHZfVThfdCAgIHZBM1tWT1NfTUFDX0FERFJfU0laRV07CgogLyogU2VxdWVuY2UgY29udHJvbCBmaWVsZCAqLwogdl9VMTZfdCAgdXNTZXFDdHJsOwoKIC8vIEZpbmQgdGhlIHNpemUgb2YgdGhlIG1hbmRhdG9yeSBoZWFkZXIgc2l6ZS4KI2RlZmluZSBXTEFOODAyMTFfTUFOREFUT1JZX0hFQURFUl9TSVpFIFwKICAgIChzaXplb2YoV0xBTlRMX01BQ0ZDVHlwZSkgKyBzaXplb2Yodl9VMTZfdCkgKyBcCiAgICAoMyAqIChzaXplb2Yodl9VOF90KSAqIFZPU19NQUNfQUREUl9TSVpFKSkgICsgXAogICAgc2l6ZW9mKHZfVTE2X3QpKQoKIC8qIE9wdGlvbmFsIEE0IGFkZHJlc3MgKi8KIHZfVThfdCAgIG9wdHZBNFtWT1NfTUFDX0FERFJfU0laRV07CgogLyogT3B0aW9uYWwgUU9TIGNvbnRyb2wgZmllbGQgKi8KIHZfVTE2X3QgIHVzUW9zQ3RybDsKfVdMQU5UTF84MDIxMUhlYWRlclR5cGU7CgovKiA4MDIuMyBoZWFkZXIgKi8KdHlwZWRlZiBzdHJ1Y3QKewogLyogRGVzdGluYXRpb24gYWRkcmVzcyBmaWVsZCAqLwogdl9VOF90ICAgdkRBW1ZPU19NQUNfQUREUl9TSVpFXTsKCiAvKiBTb3VyY2UgYWRkcmVzcyBmaWVsZCAqLwogdl9VOF90ICAgdlNBW1ZPU19NQUNfQUREUl9TSVpFXTsKCiAvKiBMZW5ndGggZmllbGQgKi8KIHZfVTE2X3QgIHVzTGVuVHlwZTsKfVdMQU5UTF84MDIzSGVhZGVyVHlwZTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBHbG9iYWwgRGF0YSBEZWZpbml0aW9ucwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2RlZmluZSBXTEFOX1RMX0lOVkFMSURfVV9TSUcgMjU1CiNkZWZpbmUgV0xBTl9UTF9JTlZBTElEX0JfU0lHIDI1NQojZGVmaW5lIEVOVEVSKCkgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIkVudGVyOiVzIiwgX19mdW5jX18pCgojZGVmaW5lIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLKCBfcFNUQSwgX3VjQUNNYXNrLCBpICkgXAogIGRvXAogIHtcCiAgICBfdWNBQ01hc2sgPSAwOyBcCiAgICBmb3IgKCBpID0gMDsgaSA8IFdMQU5UTF9NQVhfQUM7IGkrKyApIFwKICAgIHsgXAogICAgICBpZiAoIDAgIT0gKF9wU1RBKS0+YXVjQUNNYXNrW2ldICkgXAogICAgICB7IFwKICAgICAgICBfdWNBQ01hc2sgfD0gKCAxIDw8IGkgKTsgXAogICAgICB9IFwKICAgIH0gXAogIH0gd2hpbGUgKDApOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFN0YXRpYyBWYXJpYWJsZSBEZWZpbml0aW9ucwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBTdGF0aWMgRnVuY3Rpb24gRGVjbGFyYXRpb25zIGFuZCBEZWZpbml0aW9ucwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCnN0YXRpYyBWT1NfU1RBVFVTIApXTEFOVExfR2V0RXRoZXJUeXBlCigKICB2X1U4X3QgICAgICAgICAgICAgICAqIGF1Y0JESGVhZGVyLAogIHZvc19wa3RfdCAgICAgICAgICAgICogdm9zRGF0YUJ1ZmYsCiAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLAogIHZfVTE2X3QgICAgICAgICAgICAgICogdXNFdGhlclR5cGUKKTsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMU19JTlRFUk5BTAovKiBGSVhNRV9NVVNUOiBkdXJpbmcgVERMUyBpbnRlZ3JhdGlvbiB0byBtYWluL2xhdGVzdCwgV0xBTlRMX0dldEV0aGVyVHlwZSgpIGNvbmZsaWN0cy4KQnV0IHRoZXJlIGlzIGRpZmZlcmVuY2UuIGV4aXN0aW5nIFdMQU5UTF9HZXRFdGhlclR5cGUoKSBleHBlY3RzIHZvc0RhdGFCdWZmLT5vZmZzZXQgcG9pbnRzIHRvIE1QRFUgSGVhZGVyLAp3aGVyZWFzZSBURExTIGV4cGVjdCB2b3NEYXRhQnVmZi0+b2Zmc2V0IHNob3VsZCBzdGlsbCBwb2ludHMgdG8gUnhCZC4gClNvIGZhciwgZGF0YSBmcm1hZSBzdHJpcHBlZCBSeEJEIGFuZCBwYXNzZWQgdG8gZGF0YSBmcmFtZSBoYW5kbGVyLgooUnhCZCBzaG91bGQgbm90IGJlIHN0cmlwcGVkIGluIGNhc2UgVERMUywgYmVjYXVzZSBpdCB3aWxsIGJlIGV2ZW50dWFsbHkgcm91dGVkIHRvIG1nbXQgcGFja2V0IApoYW5kbGVyLCB3aGVyZSBSWCBCRCBzaG91bGQgYmUgcHJlc2VydmVkKQpUbyBhdm9pZCBicmVha2luZyBleGlzdGluZyBmdW5jdGlvbmFsaXR5LCBmb3Igbm93LCBJIHRlbXBvcmFyaWx5IHJlbmFtZSB0bwpXTEFOVExfR2V0RXRoZXJUeXBlXzIoKS4gRXZlbnR1YWxseSB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSByZW1vdmVkIGFuZCBtZXJnZWQgdG8gV0xBTlRMX0dldEV0aGVyVHlwZSgpCiovCnN0YXRpYyBWT1NfU1RBVFVTIApXTEFOVExfR2V0RXRoZXJUeXBlXzIKKAogIHZfVThfdCAgICAgICAgICAgICAgICogYXVjQkRIZWFkZXIsCiAgdm9zX3BrdF90ICAgICAgICAgICAgKiB2b3NEYXRhQnVmZiwKICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW4sCiAgdl9VMTZfdCAgICAgICAgICAgICAgKiB1c0V0aGVyVHlwZQopOwojZW5kaWYKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEFkZGluZyBhIGdsb2JhbCB2YXJpYWJsZSB0byBiZSB1c2VkIHdoZW4gZG9pbmcgZnJhbWUgdHJhbnNsYXRpb24gaW4gVHhBdXRoCiAqIHN0YXRlIHNvIGFzIHRvIG5vdCBzZXQgdGhlIHByb3RlY3RlZCBiaXQgdG8gMSBpbiB0aGUgY2FzZSBvZiBXQUkgZnJhbWVzCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdl9VOF90IGdVY0lzV2FpOwojZW5kaWYKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBFeHRlcm5hbGl6ZWQgRnVuY3Rpb24gRGVmaW5pdGlvbnMKKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERvY3VtZW50YXRpb24KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgICAgIFdMQU5UTF9GcmVlQ2xpZW50TWVtb3J5CgogIERFU0NSSVBUSU9OCiAgSXQgZnJlZXMgdXAgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gYWxsIHRoZSBTVEEgY2xpZW50cyBpbiBUTENCIGJsb2NrCiAgQ2FuIGJlIGNhbGxlZCBpbnNpZGUgQ2xvc2UsIFN0b3Agb3Igd2hlbiBzb21lIEZBVUxUIG9jY3VycwoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICBJTgogIHBDbGllbnRTVEE6ICAgIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBjbGllbnQgcG9pbnRlciBhcnJheQoKICBSRVRVUk4gVkFMVUUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdm9pZCBXTEFOVExfRnJlZUNsaWVudE1lbW9yeQooV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEFbV0xBTl9NQVhfU1RBX0NPVU5UXSkKewogICAgdl9VMzJfdCBpID0gMDsKICAgIGZvcihpID0wOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspCiAgICB7CiAgICAgICAgaWYoIE5VTEwgIT0gcENsaWVudFNUQVtpXSApCiAgICAgICAgewogICAgICAgICAgIHZvc19tZW1fZnJlZShwQ2xpZW50U1RBW2ldKTsKICAgICAgICB9CiAgICAgICAgcENsaWVudFNUQVtpXSA9IE5VTEw7CiAgICB9CiAgICByZXR1cm47Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX09wZW4KCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBIREQgYXQgZHJpdmVyIGluaXRpYWxpemF0aW9uLiBUTCB3aWxsIGluaXRpYWxpemUgYWxsIGl0cwogICAgaW50ZXJuYWwgcmVzb3VyY2VzIGFuZCB3aWxsIHdhaXQgZm9yIHRoZSBjYWxsIHRvIHN0YXJ0IHRvIHJlZ2lzdGVyCiAgICB3aXRoIHRoZSBvdGhlciBtb2R1bGVzLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHBUTENvbmZpZzogICAgICBUTCBDb25maWd1cmF0aW9uCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlCiAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX09wZW4KKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIFdMQU5UTF9Db25maWdJbmZvVHlwZSogIHBUTENvbmZpZwopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOyAKICB2X1U4X3QgICAgICAgICAgdWNJbmRleDsgCiAgdEhhbEhhbmRsZSAgICAgIHNtZUNvbnRleHQ7CiAgdl9VMzJfdCBpID0gMDsKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICBWT1NfU1RBVFVTICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwojZW5kaWYKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRU5URVIoKTsKICB2b3NfYWxsb2NfY29udGV4dCggcHZvc0dDdHgsIFZPU19NT0RVTEVfSURfVEwsIAogICAgICAgICAgICAgICAgICAgICh2b2lkKikmcFRMQ2IsIHNpemVvZihXTEFOVExfQ2JUeXBlKSk7CgogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCggTlVMTCA9PSBwVExDYiApIHx8ICggTlVMTCA9PSBwVExDb25maWcgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgICAiV0xBTiBUTDogSW52YWxpZCBpbnB1dCBwb2ludGVyIG9uIFdMQU5UTF9PcGVuIFRMICVwIENvbmZpZyAlcCIsIHBUTENiLCBwVExDb25maWcgKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyogU2V0IHRoZSBkZWZhdWx0IGxvZyBsZXZlbCB0byBWT1NfVFJBQ0VfTEVWRUxfRVJST1IgKi8KICB2b3NfdHJhY2Vfc2V0TGV2ZWwoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SKTsKCiAgc21lQ29udGV4dCA9IHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1NNRSwgcHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBzbWVDb250ZXh0ICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgc21lQ29udGV4dCIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyogWmVybyBvdXQgdGhlIG1lbW9yeSBzbyB3ZSBhcmUgT0ssIHdoZW4gQ2xlYW5DQiBpcyBjYWxsZWQuKi8KICB2b3NfbWVtX3plcm8oKHZfVk9JRF90ICopcFRMQ2IsIHNpemVvZihXTEFOVExfQ2JUeXBlKSk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDbGVhbiB1cCBUTCBjb250cm9sIGJsb2NrLCBpbml0aWFsaXplIGFsbCB2YWx1ZXMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6V0xBTlRMX09wZW4iKSk7CgogIGZvciAoIGkgPTA7IGk8V0xBTl9NQVhfU1RBX0NPVU5UOyBpKysgKQogIHsKICAgICAgaWYgKCBpIDwgV0xBTl9OT04zMl9TVEFfQ09VTlQgKQogICAgICB7CiAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSA9IHZvc19tZW1fbWFsbG9jKHNpemVvZihXTEFOVExfU1RBQ2xpZW50VHlwZSkpOwogICAgICAgICAgLyogQWxsb2NhdGluZyBtZW1vcnkgZm9yIExFR0FDWSBTVEEgQ09VTlQgc28gYXMgdG8gYXZvaWQgcmVncmVzc2lvbiBpc3N1ZXMuICAqLwogICAgICAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0gKQogICAgICAgICB7CiAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIldMQU4gVEw6IFN0YUNsaWVudCBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKICAgICAgICAgICAgIFdMQU5UTF9GcmVlQ2xpZW50TWVtb3J5KHBUTENiLT5hdGxTVEFDbGllbnRzKTsKICAgICAgICAgICAgIHZvc19mcmVlX2NvbnRleHQocHZvc0dDdHgsIFZPU19NT0RVTEVfSURfVEwsIHBUTENiKTsKICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICAgICAgIH0KICAgICAgICAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSwgc2l6ZW9mKFdMQU5UTF9TVEFDbGllbnRUeXBlKSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSA9IE5VTEw7CiAgICAgIH0KICB9CgogIHBUTENiLT5yZW9yZGVyQnVmZmVyUG9vbCA9IHZvc19tZW1fbWFsbG9jKHNpemVvZihXTEFOVExfUkVPUkRFUl9CVUZGRVJfVCkgKiBXTEFOVExfTUFYX0JBX1NFU1NJT04pOwogIGlmIChOVUxMID09IHBUTENiLT5yZW9yZGVyQnVmZmVyUG9vbCkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIldMQU4gVEw6IFJlb3JkZXIgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkIikpOwogICAgV0xBTlRMX0ZyZWVDbGllbnRNZW1vcnkocFRMQ2ItPmF0bFNUQUNsaWVudHMpOwogICAgdm9zX2ZyZWVfY29udGV4dChwdm9zR0N0eCwgVk9TX01PRFVMRV9JRF9UTCwgcFRMQ2IpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHZvc19tZW1femVybygodl9WT0lEX3QgKilwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2wsIHNpemVvZihXTEFOVExfUkVPUkRFUl9CVUZGRVJfVCkgKiBXTEFOVExfTUFYX0JBX1NFU1NJT04pOwoKICBXTEFOVExfQ2xlYW5DQihwVExDYiwgMCAvKmRvIG5vdCBlbXB0eSovKTsKCiAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOVExfTUFYX0FDIDsgdWNJbmRleCsrKQogIHsKICAgIHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNJbmRleF0gPSBwVExDb25maWctPnVjQWNXZWlnaHRzW3VjSW5kZXhdOwogIH0KCiAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOVExfTUFYX0FDIDsgdWNJbmRleCsrKQogIHsKICAgIHBUTENiLT50bENvbmZpZ0luZm8udWNSZW9yZGVyQWdpbmdUaW1lW3VjSW5kZXhdID0gcFRMQ29uZmlnLT51Y1Jlb3JkZXJBZ2luZ1RpbWVbdWNJbmRleF07CiAgfQoKICAvLyBzY2hlZHVsaW5nIGluaXQgdG8gYmUgdGhlIGxhc3Qgb25lIG9mIHByZXZpb3VzIHJvdW5kCiAgcFRMQ2ItPnVDdXJTZXJ2ZWRBQyA9IFdMQU5UTF9BQ19CSzsKICBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0ID0gMTsKICBwVExDYi0+dWNDdXJyZW50U1RBID0gV0xBTl9NQVhfU1RBX0NPVU5ULTE7CgojaWYgMAogIC8vZmxvdyBjb250cm9sIGZpZWxkIGluaXQKICB2b3NfbWVtX3plcm8oJnBUTENiLT50bEZDSW5mbywgc2l6ZW9mKHRGY1R4UGFyYW1zX3R5cGUpKTsKICAvL2JpdCAwOiBzZXQgKEJkL3BkdSBjb3VudCkgYml0IDE6IHNldCAocmVxdWVzdCBzdGF0aW9uIFBTIGNoYW5nZSBub3RpZmljYXRpb24pCiAgcFRMQ2ItPnRsRkNJbmZvLmZjQ29uZmlnID0gMHgxOwojZW5kaWYKCiAgcFRMQ2ItPnZvc1R4RkNCdWYgPSBOVUxMOwogIHBUTENiLT50bENvbmZpZ0luZm8udU1pbkZyYW1lc1Byb2NUaHJlcyA9CiAgICAgICAgICAgICAgICBwVExDb25maWctPnVNaW5GcmFtZXNQcm9jVGhyZXM7CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBwVExDYi0+dWNUZGxzUGVlckNvdW50ID0gMDsKI2VuZGlmCgogIHBUTENiLT50bENvbmZpZ0luZm8udURlbGF5ZWRUcmlnZ2VyRnJtSW50ID0KICAgICAgICAgICAgICAgIHBUTENvbmZpZy0+dURlbGF5ZWRUcmlnZ2VyRnJtSW50OwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQWxsb2NhdGUgaW50ZXJuYWwgcmVzb3VyY2VzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX3BrdF9nZXRfcGFja2V0KCZwVExDYi0+dm9zRHVtbXlCdWYsIFZPU19QS1RfVFlQRV9SWF9SQVcsIDEsIDEsCiAgICAgICAgICAgICAgICAgICAgIDEvKnRydWUqLyxOVUxMLCBOVUxMKTsKCiAgV0xBTlRMX0luaXRCQVJlb3JkZXJCdWZmZXIocHZvc0dDdHgpOwojaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwogICAvKiBJbml0aWFsaXplIEhhbmRvZmYgc3VwcG9ydCBtb2R1ZQogICAgKiBSU1NJIG1lYXN1cmUgYW5kIFRyYWZmaWMgc3RhdGUgbW9uaXRvcmluZyAqLwogIHN0YXR1cyA9IFdMQU5UTF9IU0luaXQocHZvc0dDdHgpOwogIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiSGFuZG9mZiBzdXBwb3J0IG1vZHVsZSBpbml0IGZhaWwiKSk7CiAgICBXTEFOVExfRnJlZUNsaWVudE1lbW9yeShwVExDYi0+YXRsU1RBQ2xpZW50cyk7CiAgICB2b3NfbWVtX2ZyZWUocFRMQ2ItPnJlb3JkZXJCdWZmZXJQb29sKTsKICAgIHZvc19mcmVlX2NvbnRleHQocHZvc0dDdHgsIFZPU19NT0RVTEVfSURfVEwsIHBUTENiKTsKICAgIHJldHVybiBzdGF0dXM7CiAgfQojZW5kaWYKCiAgcFRMQ2ItPmlzQk1QUyA9IFZPU19GQUxTRTsKICBwbWNSZWdpc3RlckRldmljZVN0YXRlVXBkYXRlSW5kKCBzbWVDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9Qb3dlclN0YXRlQ2hhbmdlZENCLCBwdm9zR0N0eCApOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX09wZW4gKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1N0YXJ0CgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgSEREIGFzIHBhcnQgb2YgdGhlIG92ZXJhbGwgc3RhcnQgcHJvY2VkdXJlLiBUTCB3aWxsIHVzZSB0aGlzCiAgICBjYWxsIHRvIHJlZ2lzdGVyIHdpdGggQkFMIGFzIGEgdHJhbnNwb3J0IGxheWVyIGVudGl0eS4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlCiAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICAgT3RoZXIgY29kZXMgY2FuIGJlIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGEgQkFMIGZhaWx1cmU7IHNlZSBCQUwgQVBJCiAgICBmb3IgbW9yZSBpbmZvCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1N0YXJ0CigKICB2X1BWT0lEX3QgIHB2b3NHQ3R4CikKewogIFdMQU5UTF9DYlR5cGUqICAgICAgcFRMQ2IgICAgICA9IE5VTEw7CiAgdl9VMzJfdCAgICAgICAgICAgICB1UmVzQ291bnQgPSBXREFfVExJX01JTl9SRVNfREFUQTsKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRU5URVIoKTsKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU3RhcnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlZ2lzdGVyIHdpdGggV0RBIGFzIHRyYW5zcG9ydCBsYXllciBjbGllbnQKICAgIFJlcXVlc3QgcmVzb3VyY2VzIGZvciB0eCBmcm9tIGJ1cwogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOldMQU4gVEw6V0xBTlRMX1N0YXJ0IikpOwoKICB0bFRyYWNlSW5pdCgpOwogIHZvc1N0YXR1cyA9IFdEQV9EU19SZWdpc3RlciggcHZvc0dDdHgsIAogICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9UeENvbXAsIAogICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9SeEZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfR2V0RnJhbWVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfUmVzb3VyY2VDQiwKICAgICAgICAgICAgICAgICAgICAgICAgICBXREFfVExJX01JTl9SRVNfREFUQSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHZvc0dDdHgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICZ1UmVzQ291bnQgKTsgCgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKICAgICAgICAgICAgICAgIldMQU4gVEw6VEwgZmFpbGVkIHRvIHJlZ2lzdGVyIHdpdGggQkFML1dEQSwgRXJyOiAlZCIsCiAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qIEVuYWJsZSB0cmFuc21pc3Npb24gKi8KICB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT51Y1R4U3VzcGVuZGVkLCAwKTsKCiAgcFRMQ2ItPnVSZXNDb3VudCA9IHVSZXNDb3VudDsKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1N0YXJ0ICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TdG9wCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgSEREIHRvIHN0b3Agb3BlcmF0aW9uIGluIFRMLCBiZWZvcmUgY2xvc2UuIFRMIHdpbGwgc3VzcGVuZCBhbGwKICAgIGZyYW1lIHRyYW5zZmVyIG9wZXJhdGlvbiBhbmQgd2lsbCB3YWl0IGZvciB0aGUgY2xvc2UgcmVxdWVzdCB0byBjbGVhbiB1cAogICAgaXRzIHJlc291cmNlcy4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlCiAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1N0b3AKKAogIHZfUFZPSURfdCAgcHZvc0dDdHgKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICB2X1U4X3QgICAgICB1Y0luZGV4OwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBFTlRFUigpOwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU3RvcCBUTCBhbmQgZW1wdHkgU3RhdGlvbiBsaXN0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9TdG9wIikpOwoKICAvKiBEaXNhYmxlIHRyYW5zbWlzc2lvbiAqLwogIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPnVjVHhTdXNwZW5kZWQsIDEpOwoKICBpZiAoIE5VTEwgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKQogIHsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZik7CiAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiA9IE5VTEw7CiAgfQoKICBpZiAoIE5VTEwgIT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApCiAgewogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYpOwogICAgcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiA9IE5VTEw7CiAgfQoKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0xBTlRMX0hTU3RvcChwdm9zR0N0eCkpCiAgewogICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICJIYW5kb2ZmIFN1cHBvcnQgbW9kdWxlIHN0b3AgZmFpbCIpKTsKICB9CiNlbmRpZgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENsZWFuIGNsaWVudCBzdGF0aW9ucwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgdWNJbmRleCsrKQogIHsKICAgIGlmICggTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XSApCiAgICB7CiAgICAgICAgV0xBTlRMX0NsZWFuU1RBKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdLCAxIC8qZW1wdHkgYWxsIHF1ZXVlcyovKTsKICAgIH0KICB9CgoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1N0b3AgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0Nsb3NlCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgSEREIGR1cmluZyBnZW5lcmFsIGRyaXZlciBjbG9zZSBwcm9jZWR1cmUuIFRMIHdpbGwgY2xlYW4gdXAKICAgIGFsbCB0aGUgaW50ZXJuYWwgcmVzb3VyY2VzLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfQ2xvc2UKKAogIHZfUFZPSURfdCAgcHZvc0dDdHgKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICB0SGFsSGFuZGxlIHNtZUNvbnRleHQ7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIEVOVEVSKCk7CiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIERlcmVnaXN0ZXIgZnJvbSBQTUMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBzbWVDb250ZXh0ID0gdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfU01FLCBwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHNtZUNvbnRleHQgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBzbWVDb250ZXh0IiwgX19mdW5jX18pKTsKICAgIC8vIGNvbnRpbnVlIHNvIHRoYXQgd2UgY2FuIGNsZWFudXAgYXMgbXVjaCBhcyBwb3NzaWJsZQogIH0KICBlbHNlCiAgewogICAgcG1jRGVyZWdpc3RlckRldmljZVN0YXRlVXBkYXRlSW5kKCBzbWVDb250ZXh0LCBXTEFOVExfUG93ZXJTdGF0ZUNoYW5nZWRDQiApOwogIH0KCiNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCiAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IFdMQU5UTF9IU0RlSW5pdChwdm9zR0N0eCkpCiAgewogICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICJIYW5kb2ZmIFN1cHBvcnQgbW9kdWxlIERlSW5pdCBmYWlsIikpOwogIH0KI2VuZGlmCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDbGVhbnVwIFRMIGNvbnRyb2wgYmxvY2suCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOiBXTEFOVExfQ2xvc2UiKSk7CiAgV0xBTlRMX0NsZWFuQ0IocFRMQ2IsIDEgLyogZW1wdHkgcXVldWVzL2xpc3RzL3BrdHMgaWYgYW55Ki8pOwoKICBXTEFOVExfRnJlZUNsaWVudE1lbW9yeShwVExDYi0+YXRsU1RBQ2xpZW50cyk7CgogIHZvc19tZW1fZnJlZShwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2wpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRnJlZSBUTCBjb250ZXh0IGZyb20gVk9TUyBnbG9iYWwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NfZnJlZV9jb250ZXh0KHB2b3NHQ3R4LCBWT1NfTU9EVUxFX0lEX1RMLCBwVExDYik7CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9DbG9zZSAqLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJTlRFUkFDVElPTiBXSVRIIEhERAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ29uZmlndXJlU3dGcmFtZVRYWGxhdGlvbkZvckFsbAoKICBERVNDUklQVElPTgogICAgIEZ1bmN0aW9uIHRvIGRpc2FibGUvZW5hYmxlIGZyYW1lIHRyYW5zbGF0aW9uIGZvciBhbGwgYXNzb2NpYXRpb24gc3RhdGlvbnMuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCiAgIElOCiAgICBwdm9zR0N0eDogVk9TIGNvbnRleHQgCiAgICBFbmFibGVGcmFtZVhsYXRpb24gVFJVRSBtZWFucyBlbmFibGUgU1cgdHJhbnNsYXRpb24gZm9yIGFsbCBzdGF0aW9ucy4KICAgIC4KCiAgUkVUVVJOIFZBTFVFCgogICB2b2lkLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQKV0xBTlRMX0NvbmZpZ3VyZVN3RnJhbWVUWFhsYXRpb25Gb3JBbGwKKAogIHZfUFZPSURfdCBwdm9zR0N0eCwgCiAgdl9CT09MX3QgZW5hYmxlRnJhbWVYbGF0aW9uCikKewogIHZfVThfdCB1Y0luZGV4OwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBXTEFOVExfQ2JUeXBlKiBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiAiCiAgICAgICAgICAgIldMQU5UTF9Db25maWd1cmVTd0ZyYW1lVFhYbGF0aW9uRm9yQWxsIikpOwogICAgcmV0dXJuOwogIH0KCiAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgIldMQU5UTF9Db25maWd1cmVTd0ZyYW1lVFhYbGF0aW9uRm9yQWxsOiBDb25maWd1cmUgU1cgZnJhbWVYbGF0aW9uICVkIiwgCiAgICAgIGVuYWJsZUZyYW1lWGxhdGlvbikpOwoKICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5fTUFYX1RJRDsgdWNJbmRleCsrKSAKICB7CiAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF07CiAgICBpZiAoIE5VTEwgIT0gcENsaWVudFNUQSAmJiAwICE9IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICAgIHsKI2lmZGVmIFdMQU5fU09GVEFQX1ZTVEFfRkVBVFVSRQogICAgICAvLyBpZiB0aGlzIHN0YXRpb24gd2FzIG5vdCBhbGxvY2F0ZWQgcmVzb3VyY2VzIHRvIHBlcmZvcm0gSFctYmFzZWQKICAgICAgLy8gVFggZnJhbWUgdHJhbnNsYXRpb24gdGhlbiBmb3JjZSBTVy1iYXNlZCBUWCBmcmFtZSB0cmFuc2xhdGlvbgogICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSBmcmFtZSB0cmFuc2xhdGlvbiBzdXBwbGllZCBieSB0aGUgY2xpZW50CiAgICAgIGlmICghV0RBX0lzSHdGcmFtZVR4VHJhbnNsYXRpb25DYXBhYmxlKHB2b3NHQ3R4LCB1Y0luZGV4KSkKICAgICAgewogICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiA9IDE7CiAgICAgIH0KICAgICAgZWxzZQojZW5kaWYKICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24gPSBlbmFibGVGcmFtZVhsYXRpb247CiAgICB9CiAgfQp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU3RhcnRGb3J3YXJkaW5nCgogIERFU0NSSVBUSU9OCgogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzayBzZXJpYWxpemF0aW9uIHRocm91Z2ggVFggdGhyZWFkIG9mIHRoZSAgIAogICAgY2FjaGVkIGZyYW1lIGZvcndhcmRpbmcgKGlmIHN0YXRhdGlvbiBoYXMgYmVlbiByZWdpc3RlcmVkIGluIHRoZSBtZWFuIHdoaWxlKSAKICAgIG9yIGZsdXNoaW5nIChpZiBzdGF0aW9uIGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZSB0aW1lKQoKICAgIEluIGNhc2Ugb2YgZm9yd2FyZGluZywgdXBwZXIgbGF5ZXIgaXMgb25seSByZXF1aXJlZCB0byBjYWxsIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCgpCiAgICBhbmQgZG9lc24ndCBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBleHBsaWNpdGx5LiBUTCB3aWxsIGhhbmRsZSB0aGlzIGluc2lkZSAKICAgIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCgpLiAKICAgIAogICAgSW4gY2FzZSBvZiBmbHVzaGluZywgdXBwZXIgbGF5ZXIgaXMgcmVxdWlyZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGV4cGxpY2l0bHkKICAgIAogIERFUEVOREVOQ0lFUwoKICAgIFRMIG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGdldHMgY2FsbGVkLgoKICAgCiAgUEFSQU1FVEVSUwoKICAgdWNTVEFJZDogICBzdGF0aW9uIGlkIAoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgogICAgUGxlYXNlIGNoZWNrIHJldHVybiB2YWx1ZXMgb2Ygdm9zX3R4X21xX3NlcmlhbGl6ZS4KCiAgU0lERSBFRkZFQ1RTCiAgICBJZiBUTCB3YXMgYXNrZWQgdG8gcGVyZm9ybSBXTEFOVExfQ2FjaGVTVEFGcmFtZSgpIGluIFdMQU5UTF9SeEZyYW1lcygpLCAKICAgIGVpdGhlciBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQoKSBvciB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIAogICAgd2l0aGluIHJlYXNvbmFibGUgdGltZS4gT3RoZXJ3aXNlLCBUTCB3aWxsIGtlZXAgY2FjaGVkIHZvcyBidWZmZXIgdW50aWwKICAgIG9uZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgYW5kIG1heSBlbmQgdXAgd2l0aCBzeXN0ZW0gYnVmZmVyIGV4aGFzdXRpb24uIAoKICAgIEl0J3MgYW4gdXBwZXIgbGF5ZXIncyByZXNwb25zaWJpbGl0eSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gaW4gY2FzZSBvZgogICAgZmx1c2hpbmcKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKVk9TX1NUQVRVUyAKV0xBTlRMX1N0YXJ0Rm9yd2FyZGluZwooCiAgdl9VOF90IHVjU1RBSWQsCiAgdl9VOF90IHVjVWNhc3RTaWcsIAogIHZfVThfdCB1Y0JjYXN0U2lnIAopCnsKICB2b3NfbXNnX3QgICAgICBzTWVzc2FnZTsKICB2X1UzMl90ICAgICAgICB1RGF0YTsgICAgICAgICAgICAgCiAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwoKICAvKiBTaWduYWwgdGhlIE9TIHRvIHNlcmlhbGl6ZSBvdXIgZXZlbnQgKi8KICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgIlNlcmlhbGl6aW5nIFRMIFN0YXJ0IEZvcndhcmRpbmcgQ2FjaGVkIGZvciBjb250cm9sIFNUQSAlZCIsIAogICAgICAgICAgICAgIHVjU1RBSWQgKTsKCiAgdm9zX21lbV96ZXJvKCAmc01lc3NhZ2UsIHNpemVvZih2b3NfbXNnX3QpICk7CgogIHVEYXRhID0gdWNTVEFJZCB8ICh1Y1VjYXN0U2lnIDw8IDggKSB8ICh1Y0JjYXN0U2lnIDw8IDE2KTsgCiAgc01lc3NhZ2UuYm9keXZhbCA9IHVEYXRhOwogIHNNZXNzYWdlLnR5cGUgICAgPSBXTEFOVExfUlhfRldEX0NBQ0hFRDsKCiAgcmV0dXJuIHZvc19yeF9tcV9zZXJpYWxpemUoVk9TX01RX0lEX1RMLCAmc01lc3NhZ2UpOwoKfSAvKiBXTEFOVExfU3RhcnRGb3J3YXJkaW5nKCkgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9FbmFibGVDYWNoaW5nCgogIERFU0NSSVBUSU9OCgogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGVuYWJsZSBjYWNoaW5nIG9ubHkgd2hlbiBhc3NvYy9yZWFzc29jIHJlcSBpcyBzZW5kLgogICAgdGhhdCBpcyBjYWNoZSBwYWNrZXRzIG9ubHkgZm9yIHN1Y2ggU1RBIElELgoKCiAgREVQRU5ERU5DSUVTCgogICAgVEwgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCgoKICBQQVJBTUVURVJTCgogICBzdGFJZDogICBzdGF0aW9uIGlkCgogIFJFVFVSTiBWQUxVRQoKICAgbm9uZQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQgV0xBTlRMX0VuYWJsZUNhY2hpbmcodl9VOF90IHN0YUlkKQp7CiAgdl9QVk9JRF90IHB2b3NHQ3R4PSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfVEwsTlVMTCk7CiAgV0xBTlRMX0NiVHlwZSogcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiAiCiAgICAgICAgICAgIldMQU5UTF9FbmFibGVDYWNoaW5nIikpOwogICAgcmV0dXJuOwogIH0KICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFJZF0tPmVuYWJsZUNhY2hpbmcgPSAxOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQXNzb2NGYWlsZWQKCiAgREVTQ1JJUFRJT04KCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgUEUgdG8gbm90aWZ5IFRMIHRoYXQgY2FjaGUgbmVlZHMgdG8gZmx1c2hlZCcgCiAgICB3aGVuIGFzc29jaWF0aW9uIGlzIG5vdCBzdWNjZXNzZnVsbHkgY29tcGxldGVkIAoKICAgIEludGVybmFsbHksIFRMIHBvc3QgYSBtZXNzYWdlIHRvIFRYX1RocmVhZCB0byBzZXJpYWxpemUgdGhlIHJlcXVlc3QgdG8gCiAgICBrZWVwIGxvY2stZnJlZSBtZWNoYW5pc20uCgogICAKICBERVBFTkRFTkNJRVMKCiAgICBUTCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KCiAgIAogIFBBUkFNRVRFUlMKCiAgIHVjU1RBSWQ6ICAgc3RhdGlvbiBpZCAKCiAgUkVUVVJOIFZBTFVFCgogICBub25lCiAgIAogIFNJREUgRUZGRUNUUwogICBUaGVyZSBtYXkgYmUgcmFjZSBjb25kaXRpb24gdGhhdCBQRSBjYWxsIHRoaXMgQVBJIGFuZCBzZW5kIGFub3RoZXIgYXNzb2NpYXRpb24KICAgcmVxdWVzdCBpbW1lZGlhdGVseSB3aXRoIHNhbWUgc3RhSWQgYmVmb3JlIFRYX3RocmVhZCBjYW4gcHJvY2VzcyB0aGUgbWVzc2FnZS4KCiAgIFRvIGF2b2lkIHRoaXMsIHdlIG1pZ2h0IG5lZWQgUEUgdG8gd2FpdCBmb3IgVFhfdGhyZWFkIHByb2Nlc3MgdGhlIG1lc3NhZ2UsCiAgIGJ1dCB0aGlzIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuIAogICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQgV0xBTlRMX0Fzc29jRmFpbGVkKHZfVThfdCBzdGFJZCkKewogIC8vIGZsdXNoaW5nIGZyYW1lcyBhbmQgZm9yd2FyZGluZyBmcmFtZXMgdXNlcyB0aGUgc2FtZSBtZXNzYWdlCiAgLy8gdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgbWVzc2FnZSBpcyBwcm9jZXNzZWQKICAvLyBpZiB0aGUgU1RBIGV4aXN0LCB0aGUgZnJhbWVzIHdpbGwgYmUgZm9yd2FyZGVkCiAgLy8gYW5kIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoZSBmcmFtZXMgd2lsbCBiZSBmbHVzaGVkCiAgLy8gaW4gdGhpcyBjYXNlIHdlIGtub3cgaXQgd29uJ3QgZXhpc3Qgc28gdGhlIERQVSBpbmRleCBzaWduYXR1cmUgdmFsdWVzIGRvbid0IG1hdHRlcgogIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwgVFJBQ0VfQ09ERV9UTF9BU1NPQ19GQUlMRUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YUlkLCAwKSk7CgogIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoV0xBTlRMX1N0YXJ0Rm9yd2FyZGluZyhzdGFJZCwwLDApKSkKICB7CiAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgIiAlcyBmYWlscyB0byBzdGFydCBmb3J3YXJkaW5nIChzdGFJZCAlZCkiLCBfX2Z1bmNfXywgc3RhSWQpOwogIH0KfQogIAogIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICBXTEFOVExfRmluaXNoX1VMQQoKICBERVNDUklQVElPTgogICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBIREQgdG8gbm90aWZ5IFRMIHRvIGZpbmlzaCBVcHBlciBsYXllciBhdXRoZW50aWNhdGlvbgogICAgIGluY2FzZSB0aGUgbGFzdCBFQVBPTCBwYWNrZXQgaXMgcGVuZGluZyBpbiB0aGUgVEwgcXVldWUuIAogICAgIFRvIGF2b2lkIHRoZSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIHNtZSBzZXQga2V5IGFuZCB0aGUgbGFzdCBFQVBPTCBwYWNrZXQgCiAgICAgdGhlIEhERCBtb2R1bGUgY2FsbHMgdGhpcyBmdW5jdGlvbiBqdXN0IGJlZm9yZSBjYWxsaW5nIHRoZSBzbWVfUm9hbVNldEtleS4KCiAgREVQRU5ERU5DSUVTCgogICAgIFRMIG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGdldHMgY2FsbGVkLgogIAogIFBBUkFNRVRFUlMKCiAgIGNhbGxiYWNrUm91dGluZTogICBIREQgQ2FsbGJhY2sgZnVuY3Rpb24uCiAgIGNhbGxiYWNrQ29udGV4dCA6IEhERCB1c2VyZGF0YSBjb250ZXh0LgogIAogICBSRVRVUk4gVkFMVUUKCiAgIFZPU19TVEFUVVNfU1VDQ0VTUy9WT1NfU1RBVFVTX0ZBSUxVUkUKICAgCiAgU0lERSBFRkZFQ1RTCiAgIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KClZPU19TVEFUVVMgV0xBTlRMX0ZpbmlzaF9VTEEoIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYWxsYmFja0NvbnRleHQpCnsKICAgcmV0dXJuIFdEQV9EU19GaW5pc2hVTEEoIGNhbGxiYWNrUm91dGluZSwgY2FsbGJhY2tDb250ZXh0KTsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudAoKICBERVNDUklQVElPTgoKICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBIREQgdG8gcmVnaXN0ZXIgYXMgYSBjbGllbnQgZm9yIGRhdGEgc2VydmljZXMKICAgIHdpdGggVEwuIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgZm9yIGVhY2ggbmV3IHN0YXRpb24gdGhhdCBpdCBhZGRzLAogICAgdGh1cyBoYXZpbmcgdGhlIGZsZXhpYmlsaXR5IG9mIHJlZ2lzdGVyaW5nIGRpZmZlcmVudCBjYWxsYmFjayBmb3IgZWFjaAogICAgU1RBIGl0IHNlcnZpY2VzLgoKICBERVBFTkRFTkNJRVMKCiAgICBUTCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KCiAgICBSZXN0cmljdGlvbjoKICAgICAgTWFpbiB0aHJlYWQgd2lsbCBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGF0IFR4IGFuZCBSeCB0aHJlYWRzIHRodXMKICAgICAgZ3VhcmFudGVlaW5nIHRoYXQgYSBzdGF0aW9uIHdpbGwgYmUgYWRkZWQgYmVmb3JlIGFueSBkYXRhIGNhbiBiZQogICAgICByZWNlaXZlZCBmb3IgaXQuIChUaGlzIGVuYWJsZXMgVEwgdG8gYmUgbG9jayBmcmVlKQoKICBQQVJBTUVURVJTCgogICBwdm9zR0N0eDogICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHBmblN0QVJ4OiAgICAgICAgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgcmVjZWl2ZSBwYWNrZXQgaGFuZGxlciBmcm9tIEhERAogICBwZm5TVEFUeENvbXA6ICAgIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIHRyYW5zbWl0IGNvbXBsZXRlIGNvbmZpcm1hdGlvbgogICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgZnJvbSBIREQKICAgcGZuU1RBRmV0Y2hQa3Q6ICBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSBwYWNrZXQgcmV0cmlldmFsIHJvdXRpbmUgaW4gSERECiAgIHdTVEFEZXNjVHlwZTogICAgU1RBIERlc2NyaXB0b3IsIGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgbmV3IGFkZGVkIFNUQQoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9SZWdpc3RlclNUQUNsaWVudAooCiAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICBwdm9zR0N0eCwKICBXTEFOVExfU1RBUnhDQlR5cGUgICAgICAgIHBmblNUQVJ4LAogIFdMQU5UTF9UeENvbXBDQlR5cGUgICAgICAgcGZuU1RBVHhDb21wLAogIFdMQU5UTF9TVEFGZXRjaFBrdENCVHlwZSAgcGZuU1RBRmV0Y2hQa3QsCiAgV0xBTl9TVEFEZXNjVHlwZSogICAgICAgICBwd1NUQURlc2NUeXBlLAogIHZfUzdfdCAgICAgICAgICAgICAgICAgICAgcnNzaQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICB2X1U4X3QgICAgdWNUaWQgPSAwOy8qTG9jYWwgdmFyaWFibGUgdG8gY2xlYXIgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXJzIG9mIFNUQSBvbiBhbGwgVElEcyovCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBFTlRFUigpOwogIGlmICgoIE5VTEwgPT0gcHdTVEFEZXNjVHlwZSApIHx8ICggTlVMTCA9PSBwZm5TVEFSeCApIHx8CiAgICAgICggTlVMTCA9PSBwZm5TVEFGZXRjaFBrdCApKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8vQ29kZSBmb3IgY2hlY2tpbmcgYW5kIGFsbG9jYXRpbmcgbWVtb3J5IGZvciBuZXcgU1RBCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdICl7CiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKFdMQU5UTF9TVEFDbGllbnRUeXBlKSk7CiAgICAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXSApewogICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6IFNUQSBDbGllbnQgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGluIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCIpKTsKICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgICAgfQogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgIldMQU4gVEw6IFNUQSBDbGllbnQgbWVtb3J5IGFsbG9jYXRpb24gaW4gV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50IikpOwogICAgICB2b3NfbWVtX3plcm8oKHZfVk9JRF90ICopIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLHNpemVvZihXTEFOVExfU1RBQ2xpZW50VHlwZSkpOwogIH0KCiAgLy9Bc3NpZ25pbmcgdGhlIHBvaW50ZXIgdG8gbG9jYWwgdmFyaWFibGUgZm9yIGVhc3kgYWNjZXNzIGluIGZ1dHVyZQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXTsKICBpZiAoIDAgIT0gcENsaWVudFNUQS0+dWNFeGlzdHMgKQogIHsKICAgIHBDbGllbnRTVEEtPnVjRXhpc3RzKys7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZWdpc3RlciBzdGF0aW9uIHdpdGggVEwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsIFRSQUNFX0NPREVfVExfUkVHSVNURVJfU1RBX0NMSUVOVCwKICAgICAgICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQsICh1bnNpZ25lZCApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKHB3U1RBRGVzY1R5cGUtPnZTVEFNQUNBZGRyZXNzLmJ5dGVzKzIpPDwyNCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB3U1RBRGVzY1R5cGUtPnZTVEFNQUNBZGRyZXNzLmJ5dGVzKzMpPDwxNiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB3U1RBRGVzY1R5cGUtPnZTVEFNQUNBZGRyZXNzLmJ5dGVzKzQpPDw4IHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHdTVEFEZXNjVHlwZS0+dlNUQU1BQ0FkZHJlc3MuYnl0ZXMrNSkpKSk7CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpSZWdpc3RlcmluZyBTVEEgQ2xpZW50IElEOiAlZCIsIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQgKSk7CgogIHBDbGllbnRTVEEtPnBmblNUQVJ4ICAgICAgID0gcGZuU1RBUng7CiAgcENsaWVudFNUQS0+cGZuU1RBRmV0Y2hQa3QgPSBwZm5TVEFGZXRjaFBrdDsKCiAgLyogT25seSByZWdpc3RlciBpZiBkaWZmZXJlbnQgZnJvbSBOVUxMIC0gVEwgZGVmYXVsdCBUeCBDb21wIENiIHdpbGwKICAgIHJlbGVhc2UgdGhlIHZvcyBwYWNrZXQgKi8KICBpZiAoIE5VTEwgIT0gcGZuU1RBVHhDb21wICkKICB7CiAgICBwQ2xpZW50U1RBLT5wZm5TVEFUeENvbXAgICA9IHBmblNUQVR4Q29tcDsKICB9CgogIHBDbGllbnRTVEEtPnRsU3RhdGUgID0gV0xBTlRMX1NUQV9JTklUOwogIHBDbGllbnRTVEEtPnRsUHJpICAgID0gV0xBTlRMX1NUQV9QUklfTk9STUFMOwogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU1RBSWQgID0gcHdTVEFEZXNjVHlwZS0+dWNTVEFJZDsKICBwQ2xpZW50U1RBLT5wdGtJbnN0YWxsZWQgPSAwOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgU1RBIENsaWVudCBJRDogJWQgd2l0aCBVQyAlZCBhbmQgQkMgJWQiLCAKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQsIAogICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjVWNhc3RTaWcsIHB3U1RBRGVzY1R5cGUtPnVjQmNhc3RTaWcpKTsKCiAgcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUgPSBwd1NUQURlc2NUeXBlLT53U1RBVHlwZTsKCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNRb3NFbmFibGVkID0gcHdTVEFEZXNjVHlwZS0+dWNRb3NFbmFibGVkOwoKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0FkZFJtdkxMQyA9IHB3U1RBRGVzY1R5cGUtPnVjQWRkUm12TExDOwoKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Byb3RlY3RlZEZyYW1lID0gcHdTVEFEZXNjVHlwZS0+dWNQcm90ZWN0ZWRGcmFtZTsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNJc0VzZVN0YSA9IHB3U1RBRGVzY1R5cGUtPnVjSXNFc2VTdGE7CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpSZWdpc3RlcmluZyBTVEEgQ2xpZW50IElEOiAlZCBRb1MgJWQgQWRkIExMQyAlZCBQcm90RnJhbWUgJWQgRXNlU3RhICVkIiwKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQsIAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNRb3NFbmFibGVkLAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNBZGRSbXZMTEMsCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1Byb3RlY3RlZEZyYW1lLAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNJc0VzZVN0YSkpOwojZWxzZQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgU1RBIENsaWVudCBJRDogJWQgUW9TICVkIEFkZCBMTEMgJWQgUHJvdEZyYW1lICVkIiwgCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1NUQUlkLCAKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjUW9zRW5hYmxlZCwKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjQWRkUm12TExDLAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNQcm90ZWN0ZWRGcmFtZSkpOwoKI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0VTRQojaWZkZWYgV0xBTl9TT0ZUQVBfVlNUQV9GRUFUVVJFCiAgLy8gaWYgdGhpcyBzdGF0aW9uIHdhcyBub3QgYWxsb2NhdGVkIHJlc291cmNlcyB0byBwZXJmb3JtIEhXLWJhc2VkCiAgLy8gVFggZnJhbWUgdHJhbnNsYXRpb24gdGhlbiBmb3JjZSBTVy1iYXNlZCBUWCBmcmFtZSB0cmFuc2xhdGlvbgogIC8vIG90aGVyd2lzZSB1c2UgdGhlIGZyYW1lIHRyYW5zbGF0aW9uIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQKCiAgaWYgKCFXREFfSXNId0ZyYW1lVHhUcmFuc2xhdGlvbkNhcGFibGUocHZvc0dDdHgsIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQpCiAgICAgIHx8ICggV0xBTl9TVEFfQlRfQU1QID09IHB3U1RBRGVzY1R5cGUtPndTVEFUeXBlKSkKICB7CiAgICAgIHB3U1RBRGVzY1R5cGUtPnVjU3dGcmFtZVRYWGxhdGlvbiA9IDE7CiAgfQojZW5kaWYKCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uID0gcHdTVEFEZXNjVHlwZS0+dWNTd0ZyYW1lVFhYbGF0aW9uOwogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU3dGcmFtZVJYWGxhdGlvbiA9IHB3U1RBRGVzY1R5cGUtPnVjU3dGcmFtZVJYWGxhdGlvbjsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjSXNXYXBpU3RhID0gcHdTVEFEZXNjVHlwZS0+dWNJc1dhcGlTdGE7CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwoKICB2b3NfY29weV9tYWNhZGRyKCAmcENsaWVudFNUQS0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MsICZwd1NUQURlc2NUeXBlLT52U1RBTUFDQWRkcmVzcyk7CgogIHZvc19jb3B5X21hY2FkZHIoICZwQ2xpZW50U1RBLT53U1RBRGVzYy52QlNTSURmb3JJQlNTLCAmcHdTVEFEZXNjVHlwZS0+dkJTU0lEZm9ySUJTUyk7CgogIHZvc19jb3B5X21hY2FkZHIoICZwQ2xpZW50U1RBLT53U1RBRGVzYy52U2VsZk1BQ0FkZHJlc3MsICZwd1NUQURlc2NUeXBlLT52U2VsZk1BQ0FkZHJlc3MpOwoKICAvKiBJbiB2b2xhbnMgcmVsZWFzZSBMIHJlcGxheSBjaGVjayBpcyBkb25lIGF0IFRMICovCiAgcENsaWVudFNUQS0+dWNJc1JlcGxheUNoZWNrVmFsaWQgPSBwd1NUQURlc2NUeXBlLT51Y0lzUmVwbGF5Q2hlY2tWYWxpZDsKICBwQ2xpZW50U1RBLT51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkID0gIDA7Ci8qQ2xlYXIgcmVwbGF5IGNvdW50ZXJzIG9mIHRoZSBTVEEgb24gYWxsIFRJRHMqLwogIGZvcih1Y1RpZCA9IDA7IHVjVGlkIDwgV0xBTlRMX01BWF9USUQgOyB1Y1RpZCsrKQogIHsKICAgIHBDbGllbnRTVEEtPnVsbFJlcGxheUNvdW50ZXJbdWNUaWRdID0gIDA7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIFNldCB0aGUgQUMgZm9yIHRoZSByZWdpc3RlcmVkIHN0YXRpb24gdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgQUMKICAgICAgRXZlbiBpZiB0aGlzIEFDIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHN0YXRpb24sIGNvcnJlY3Rpb24gd2lsbCBiZQogICAgICBtYWRlIGluIHRoZSBtYWluIFRMIGxvb3AgYWZ0ZXIgdGhlIHN1cHBvcnRlZCBtYXNrIGlzIHByb3Blcmx5CiAgICAgIHVwZGF0ZWQgaW4gdGhlIHBlbmRpbmcgcGFja2V0cyBjYWxsCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcENsaWVudFNUQS0+dWNDdXJyZW50QUMgICAgID0gV0xBTlRMX0FDX1ZPOwogIHBDbGllbnRTVEEtPnVjQ3VycmVudFdlaWdodCA9IDA7CiAgcENsaWVudFNUQS0+dWNTZXJ2aWNlZEFDICAgID0gV0xBTlRMX0FDX0JLOwogIHBDbGllbnRTVEEtPnVjRWFwb2xQa3RQZW5kaW5nID0gMDsKCiAgdm9zX21lbV96ZXJvKCBwQ2xpZW50U1RBLT5hdWNBQ01hc2ssIHNpemVvZihwQ2xpZW50U1RBLT5hdWNBQ01hc2spKTsKCiAgdm9zX21lbV96ZXJvKCAmcENsaWVudFNUQS0+d1VBUFNESW5mbywgc2l6ZW9mKHBDbGllbnRTVEEtPndVQVBTREluZm8pKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVvcmRlcmluZyBpbmZvIGFuZCBBTVNEVSBkZS1hZ2dyZWdhdGlvbgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc19tZW1femVybyggcENsaWVudFNUQS0+YXRsQkFSZW9yZGVySW5mbywKICAgICBzaXplb2YocENsaWVudFNUQS0+YXRsQkFSZW9yZGVySW5mb1swXSkqCiAgICAgV0xBTl9NQVhfVElEKTsKCiAgdm9zX21lbV96ZXJvKCBwQ2xpZW50U1RBLT5hdWNNUERVSGVhZGVyLAogICAgICAgICAgICAgICAgV0xBTlRMX01QRFVfSEVBREVSX0xFTik7CgogIHBDbGllbnRTVEEtPnVjTVBEVUhlYWRlckxlbiAgID0gMDsKICBwQ2xpZW50U1RBLT52b3NBTVNEVUNoYWluICAgICA9IE5VTEw7CiAgcENsaWVudFNUQS0+dm9zQU1TRFVDaGFpblJvb3QgPSBOVUxMOwoKCiAgLyogUmVvcmRlciBMT0NLCiAgICogRHVyaW5nIGhhbmRsZSBub3JtYWwgUlggZnJhbWUgd2l0aGluIFJYIHRocmVhZCwKICAgKiBpZiBNQyB0aHJlYWQgdHJ5IHRvIHByZWVtcHQsIEFEREJBLCBERUxCQSwgVElNRVIKICAgKiBDb250ZXh0IHNob3VsZCBiZSBwcm90ZWN0ZWQgZnJvbSByYWNlICovCiAgZm9yICh1Y1RpZCA9IDA7IHVjVGlkIDwgV0xBTl9NQVhfVElEIDsgdWNUaWQrKykKICB7CiAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUygKICAgICAgICB2b3NfbG9ja19pbml0KCZwQ2xpZW50U1RBLT5hdGxCQVJlb3JkZXJJbmZvW3VjVGlkXS5yZW9yZGVyTG9jaykpKQogICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIkxvY2sgSW5pdCBGYWlsIikpOwogICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgfQogIH0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTdGF0cyBpbmZvCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX21lbV96ZXJvKCBwQ2xpZW50U1RBLT5hdVJ4Q291bnQsCiAgICAgIHNpemVvZihwQ2xpZW50U1RBLT5hdVJ4Q291bnRbMF0pKgogICAgICBXTEFOX01BWF9USUQpOwoKICB2b3NfbWVtX3plcm8oIHBDbGllbnRTVEEtPmF1VHhDb3VudCwKICAgICAgc2l6ZW9mKHBDbGllbnRTVEEtPmF1UnhDb3VudFswXSkqCiAgICAgIFdMQU5fTUFYX1RJRCk7CiAgLyogSW5pdGlhbCBSU1NJIGlzIGFsd2F5cyByZXBvcnRlZCBhcyB6ZXJvIGJlY2F1c2UgVEwgZG9lc250IGhhdmUgZW5vdWdoCiAgICAgZGF0YSB0byBjYWxjdWxhdGUgUlNTSS4gU28gdG8gYXZvaWQgcmVwb3J0aW5nIHplcm8sIHdlIGFyZSBpbml0aWFsaXppbmcKICAgICBSU1NJIHdpdGggUlNTSSBzYXZlZCBpbiBCc3NEZXNjcmlwdGlvbiBkdXJpbmcgc2Nhbm5pbmcuICovCiAgcENsaWVudFNUQS0+cnNzaUF2ZyA9IHJzc2k7CiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIGlmKFdMQU5fU1RBX1RETFMgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpCiAgewogICAgLyogSWYgY2xpZW50IGlzIFRETFMsIHVzZSBURExTIHNwZWNpZmljIGFscGhhICovCiAgICBwQ2xpZW50U1RBLT5yc3NpQWxwaGEgPSBXTEFOVExfSE9fVERMU19BTFBIQTsKICB9CiAgZWxzZQogIHsKICAgIHBDbGllbnRTVEEtPnJzc2lBbHBoYSA9IFdMQU5UTF9IT19ERUZBVUxUX0FMUEhBOwogIH0KI2Vsc2UKICAgIHBDbGllbnRTVEEtPnJzc2lBbHBoYSA9IFdMQU5UTF9IT19ERUZBVUxUX0FMUEhBOwojZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCiAgcENsaWVudFNUQS0+cnNzaURhdGFBbHBoYSA9IFdMQU5UTF9IT19ERUZBVUxUX0FMUEhBOwogIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbMF0uYWMgPSBXTEFOVExfQUNfQks7CiAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1sxXS5hYyA9IFdMQU5UTF9BQ19CRTsKICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzJdLmFjID0gV0xBTlRMX0FDX1ZJOwogIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbM10uYWMgPSBXTEFOVExfQUNfVk87CiNlbmRpZgoKICAvKlR4IG5vdCBzdXNwZW5kZWQgYW5kIHN0YXRpb24gZnVsbHkgcmVnaXN0ZXJlZCovCiAgdm9zX2F0b21pY19zZXRfVTgoCiAgICAgICAgJnBDbGllbnRTVEEtPnVjVHhTdXNwZW5kZWQsIDApOwoKICAvKiBVc2VkIHVudGlsIG11bHRpcGxlIHN0YXRpb24gc3VwcG9ydCB3aWxsIGJlIGFkZGVkKi8KICBwVExDYi0+dWNSZWdpc3RlcmVkU3RhSWQgPSBwd1NUQURlc2NUeXBlLT51Y1NUQUlkOwoKICAvKiBTYXZlIHRoZSBCQVAgc3RhdGlvbiBJRCBmb3IgZnV0dXJlIHVzYWdlICovCiAgaWYgKCBXTEFOX1NUQV9CVF9BTVAgPT0gcHdTVEFEZXNjVHlwZS0+d1NUQVR5cGUgKQogIHsKICAgIHBUTENiLT50bEJBUENsaWVudC51Y0JBUFNUQUlkID0gcHdTVEFEZXNjVHlwZS0+dWNTVEFJZDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTdGF0aXN0aWNzIGluZm8gCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgbWVtc2V0KCZwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljcywKICAgICAgICAgMCwgc2l6ZW9mKFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSkpOwoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFN0YXJ0IHdpdGggdGhlIHN0YXRlIHN1Z2dlc3RlZCBieSBjbGllbnQgY2FsbGVyCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcENsaWVudFNUQS0+dGxTdGF0ZSA9IHB3U1RBRGVzY1R5cGUtPnVjSW5pdFN0YXRlOwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFmdGVyIGFsbCB0aGUgaW5pdCBpcyBjb21wbGV0ZSB3ZSBjYW4gbWFyayB0aGUgZXhpc3RhbmNlIGZsYWcgCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwQ2xpZW50U1RBLT51Y0V4aXN0cysrOwoKICAvL2Zsb3cgY29udHJvbCBmaWVsZHMgaW5pdAogIHBDbGllbnRTVEEtPnVjTHdtTW9kZUVuYWJsZWQgPSBGQUxTRTsKICBwQ2xpZW50U1RBLT51Y0x3bUV2ZW50UmVwb3J0ZWQgPSBGQUxTRTsKICBwQ2xpZW50U1RBLT5ibXVNZW1Db25zdW1lZCA9IDA7CiAgcENsaWVudFNUQS0+dUluZ3Jlc3NfbGVuZ3RoID0gMDsKICBwQ2xpZW50U1RBLT51QnVmZlRocmVzaG9sZE1heCA9IFdMQU5UTF9TVEFfQk1VX1RIUkVTSE9MRF9NQVg7CgogIHBDbGllbnRTVEEtPnVMd21UaHJlc2hvbGQgPSBXTEFOVExfU1RBX0JNVV9USFJFU0hPTERfTUFYIC8gMzsKCiAgLy9AQEAgSEREU09GVEFQIGRvZXMgbm90IHF1ZXVlIHVucmVnaXN0ZXJlZCBwYWNrZXQgZm9yIG5vdwogIGlmICggV0xBTl9TVEFfU09GVEFQICE9IHB3U1RBRGVzY1R5cGUtPndTVEFUeXBlICkKICB7IAogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgRm9yd2FyZCByZWNlaXZlZCBmcmFtZXMgd2hpbGUgU1RBIHdhcyBub3QgeWV0IHJlZ2lzdGVyZWQgCiAgICAtICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoV0xBTlRMX1N0YXJ0Rm9yd2FyZGluZyggcHdTVEFEZXNjVHlwZS0+dWNTVEFJZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjVWNhc3RTaWcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y0JjYXN0U2lnKSkpCiAgICB7CiAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICIgJXMgZmFpbHMgdG8gc3RhcnQgZm9yd2FyZGluZyIsIF9fZnVuY19fKTsKICAgIH0KI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgICBpZiggV0xBTl9TVEFfVERMUyA9PSBwd1NUQURlc2NUeXBlLT53U1RBVHlwZSApCiAgICAgICAgcFRMQ2ItPnVjVGRsc1BlZXJDb3VudCsrOwojZW5kaWYKICB9CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0NsZWFyU1RBQ2xpZW50CgogIERFU0NSSVBUSU9OCgogICAgSEREIHdpbGwgY2FsbCB0aGlzIEFQSSB3aGVuIGl0IG5vIGxvbmdlciBuZWVkcyBkYXRhIHNlcnZpY2VzIGZvciB0aGUKICAgIHBhcnRpY3VsYXIgc3RhdGlvbi4KCiAgREVQRU5ERU5DSUVTCgogICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjbGVhciByZWdpc3RyYXRpb24gaXMKICAgIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgcHZvc0dDdHg6ICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgIGlkZW50aWZpZXIgZm9yIHRoZSBTVEEgdG8gYmUgY2xlYXJlZAoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9DbGVhclNUQUNsaWVudAooCiAgdl9QVk9JRF90ICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgdWNTVEFJZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOyAKICB2X1U4X3QgIHVjSW5kZXg7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIEVOVEVSKCk7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9DbGVhclNUQUNsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NsZWFyU1RBQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfQ2xlYXJTVEFDbGllbnQiKSk7CiAgICAvKiBDbGVhbiBwYWNrZXRzIGNhY2hlZCBmb3IgdGhlIFNUQSAqLwogICAgV0xBTlRMX1N0YXJ0Rm9yd2FyZGluZyh1Y1NUQUlkLDAsMCk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qIERlbGV0ZSBCQSBzZXNzaW9ucyBvbiBhbGwgVElEJ3MgKi8KICBmb3IgKHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTl9NQVhfVElEIDsgdWNJbmRleCsrKQogIHsKICAgICBXTEFOVExfQmFTZXNzaW9uRGVsKHB2b3NHQ3R4LCB1Y1NUQUlkLCB1Y0luZGV4KTsKICAgICB2b3NfbG9ja19kZXN0cm95KCZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+YXRsQkFSZW9yZGVySW5mb1t1Y0luZGV4XS5yZW9yZGVyTG9jayk7CiAgfQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgLyogZGVjcmVtZW50IHVjVGRsc1BlZXJDb3VudCBvbmx5IGlmIGl0IGlzIG5vbi16ZXJvICovICAKICBpZihXTEFOX1NUQV9URExTID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT53U1RBRGVzYy53U1RBVHlwZQogICAgICAmJiBwVExDYi0+dWNUZGxzUGVlckNvdW50KQogICAgICBwVExDYi0+dWNUZGxzUGVlckNvdW50LS07CiNlbmRpZgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2xlYXIgc3RhdGlvbgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpDbGVhcmluZyBTVEEgQ2xpZW50IElEOiAlZCIsIHVjU1RBSWQgKSk7CiAgV0xBTlRMX0NsZWFuU1RBKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLCAxIC8qZW1wdHkgcGFja2V0cyovKTsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkNsZWFyaW5nIFNUQSBSZXNldCBIaXN0b3J5IFJTU0kgYW5kIFJlZ2lvbiBudW1iZXIiKSk7CiAgcFRMQ2ItPmhvU3VwcG9ydC5jdXJyZW50SE9TdGF0ZS5oaXN0b3J5UlNTSSA9IDA7CiAgcFRMQ2ItPmhvU3VwcG9ydC5jdXJyZW50SE9TdGF0ZS5yZWdpb25OdW1iZXIgPSAwOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0NsZWFyU1RBQ2xpZW50ICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ2hhbmdlU1RBU3RhdGUKCiAgREVTQ1JJUFRJT04KCiAgICBIREQgd2lsbCBtYWtlIHRoaXMgbm90aWZpY2F0aW9uIHdoZW5ldmVyIGEgY2hhbmdlIG9jY3VycyBpbiB0aGUKICAgIGNvbm5lY3Rpdml0eSBzdGF0ZSBvZiBhIHBhcnRpY3VsYXIgU1RBLgoKICBERVBFTkRFTkNJRVMKCiAgICBBIHN0YXRpb24gbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGNoYW5nZSBzdGF0ZSBjYW4gYmUKICAgIGNhbGxlZC4KCiAgICBSRVNUUklDVElPTjogQSBzdGF0aW9uIGlzIGJlaW5nIG5vdGlmaWVkIGFzIGF1dGhlbnRpY2F0ZWQgYmVmb3JlIHRoZQogICAgICAgICAgICAgICAgIGtleXMgYXJlIGluc3RhbGxlZCBpbiBIVy4gVGhpcyB3YXkgaWYgYSBmcmFtZSBpcyByZWNlaXZlZAogICAgICAgICAgICAgICAgIGJlZm9yZSB0aGUga2V5cyBhcmUgaW5zdGFsbGVkIERQVSB3aWxsIGRyb3AgdGhhdCBmcmFtZS4KCiAgICBNYWluIHRocmVhZCBoYXMgaGlnaGVyIHByaW9yaXR5IHRoYXQgVHggYW5kIFJ4IHRocmVhZHMgdGh1cyBndWFyYW50ZWVpbmcKICAgIHRoZSBmb2xsb3dpbmc6CiAgICAgICAgLSBhIHN0YXRpb24gd2lsbCBiZSBpbiBhc3NvYyBzdGF0ZSBpbiBUTCBiZWZvcmUgVEwgcmVjZWl2ZXMgYW55IGRhdGEKICAgICAgICAgIGZvciBpdAoKICBQQVJBTUVURVJTCgogICBwdm9zR0N0eDogICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICAgaWRlbnRpZmllciBmb3IgdGhlIFNUQSB0aGF0IGlzIHBlbmRpbmcgdHJhbnNtaXNzaW9uCiAgIHRsU1RBU3RhdGU6ICAgICB0aGUgbmV3IHN0YXRlIG9mIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBzdGF0aW9uCgoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgdG8KICAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0NoYW5nZVNUQVN0YXRlCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgV0xBTlRMX1NUQVN0YXRlVHlwZSAgIHRsU1RBU3RhdGUKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggdGxTVEFTdGF0ZSA+PSBXTEFOVExfU1RBX01BWF9TVEFURSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoYW5nZSBTVEEgc3RhdGUKICAgIE5vIG5lZWQgdG8gbG9jayB0aGlzIG9wZXJhdGlvbiwgc2VlIHJlc3RyaWN0aW9ucyBhYm92ZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpDaGFuZ2luZyBzdGF0ZSBmb3IgU1RBIENsaWVudCBJRDogJWQgZnJvbSAlZCB0byAlZCIsCiAgICAgICAgICAgICB1Y1NUQUlkLCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dGxTdGF0ZSwgdGxTVEFTdGF0ZSkpOwoKICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsCiAgICAgICAgICAgICAgICAgICBUUkFDRV9DT0RFX1RMX1NUQV9TVEFURSwgdWNTVEFJZCx0bFNUQVN0YXRlICkpOwoKICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dGxTdGF0ZSA9IHRsU1RBU3RhdGU7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFQdGtJbnN0YWxsZWQKCiAgREVTQ1JJUFRJT04KCiAgICBIREQgd2lsbCBtYWtlIHRoaXMgbm90aWZpY2F0aW9uIHdoZW5ldmVyIFBUSyBpcyBpbnN0YWxsZWQgZm9yIHRoZSBTVEEKCiAgREVQRU5ERU5DSUVTCgogICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjaGFuZ2Ugc3RhdGUgY2FuIGJlCiAgICBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgIHB2b3NHQ3R4OiAgICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgICBpZGVudGlmaWVyIGZvciB0aGUgU1RBIGZvciB3aGljaCBQYWlyd2lzZSBrZXkgaXMKICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWQKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TVEFQdGtJbnN0YWxsZWQKKAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIEZMKCJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IikpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgRkwoIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCIpKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICBGTCgiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIikpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnB0a0luc3RhbGxlZCA9IDE7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU1RBUHRrSW5zdGFsbGVkICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfR2V0U1RBU3RhdGUKCiAgREVTQ1JJUFRJT04KCiAgICBSZXR1cm5zIGNvbm5lY3Rpdml0eSBzdGF0ZSBvZiBhIHBhcnRpY3VsYXIgU1RBLgoKICBERVBFTkRFTkNJRVMKCiAgICBBIHN0YXRpb24gbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgaXRzIHN0YXRlIGNhbiBiZSByZXRyaWV2ZWQuCgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24KCiAgICBPVVQKICAgIHB0bFNUQVN0YXRlOiAgICB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbiB0byB0aGUgZ2l2ZW4gc3RhdGlvbgoKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9HZXRTVEFTdGF0ZQooCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9TVEFTdGF0ZVR5cGUgICAqcHRsU1RBU3RhdGUKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwdGxTVEFTdGF0ZSApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9HZXRTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9HZXRTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfR2V0U1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9HZXRTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEdldCBTVEEgc3RhdGUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAqcHRsU1RBU3RhdGUgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dGxTdGF0ZTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9HZXRTVEFTdGF0ZSAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgV0xBTlRMX1VwZGF0ZVNUQUJzc0lkZm9ySUJTUwoKICBERVNDUklQVElPTgogICAgSEREIHdpbGwgY2FsbCB0aGlzIEFQSSB0byB1cGRhdGUgdGhlIEJTU0lEIGZvciB0aGlzIFN0YXRpb24uCgogIERFUEVOREVOQ0lFUwogICAgVGhlIEhERCBTaG91bGQgcmVnaXN0ZXJlZCB0aGUgc3RhSUQgd2l0aCBUTCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICBQb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBXREEncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgSU4KICAgIHVjU1RBSWQgICAgICAgVGhlIFN0YXRpb24gSUQgZm9yIEJzc2lkIHRvIGJlIHVwZGF0ZWQKICAgIElOCiAgICBwQnNzaWQgICAgICAgICAgQlNTSUQgdG8gYmUgdXBkYXRlZAoKICBSRVRVUk4gVkFMVUUKICAgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgICBTSURFIEVGRkVDVFMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKVk9TX1NUQVRVUwpXTEFOVExfVXBkYXRlU1RBQnNzSWRmb3JJQlNTCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgdl9VOF90ICAgICAgICAgICAgICAgKnBCc3NpZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBVcGRhdGUgdGhlIElCU1MgQlNTSUQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NfbWVtX2NvcHkoICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+d1NUQURlc2MudkJTU0lEZm9ySUJTUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NpZCwgc2l6ZW9mKHZfTUFDQUREUl90KSk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFQa3RQZW5kaW5nCgogIERFU0NSSVBUSU9OCgogICAgSEREIHdpbGwgY2FsbCB0aGlzIEFQSSB3aGVuIGEgcGFja2V0IGlzIHBlbmRpbmcgdHJhbnNtaXNzaW9uIGluIGl0cwogICAgcXVldWVzLgoKICBERVBFTkRFTkNJRVMKCiAgICBBIHN0YXRpb24gbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIHBhY2tldCBwZW5kaW5nCiAgICBub3RpZmljYXRpb24gY2FuIGJlIHNlbnQuCgogICAgUkVTVFJJQ1RJT046IFRMIHdpbGwgbm90IGNvdW50IHBhY2tldHMgZm9yIHBlbmRpbmcgbm90aWZpY2F0aW9uLgogICAgICAgICAgICAgICAgIEhERCBpcyBleHBlY3RlZCB0byBzZW5kIHRoZSBub3RpZmljYXRpb24gb25seSB3aGVuCiAgICAgICAgICAgICAgICAgbm9uLWVtcHR5IGV2ZW50IGdldHMgdHJpZ2dlcmVkLiBXb3JzdCBjYXNlIHNjZW5hcmlvCiAgICAgICAgICAgICAgICAgaXMgdGhhdCBUTCBtaWdodCBlbmQgdXAgbWFraW5nIGEgY2FsbCB3aGVuIEhkZHMKICAgICAgICAgICAgICAgICBxdWV1ZXMgYXJlIGFjdHVhbGx5IGVtcHR5LgoKICBQQVJBTUVURVJTCgogICAgcHZvc0dDdHg6ICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgaWRlbnRpZmllciBmb3IgdGhlIFNUQSB0aGF0IGlzIHBlbmRpbmcgdHJhbnNtaXNzaW9uCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBUGt0UGVuZGluZwooCiAgdl9QVk9JRF90ICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgICAgdWNTVEFJZCwKICBXTEFOVExfQUNFbnVtVHlwZSAgICB1Y0FjCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAiV0xBTiBUTDpQYWNrZXQgcGVuZGluZyBpbmRpY2F0aW9uIGZvciBTVEE6ICVkIEFDOiAlZCIsIHVjU1RBSWQsIHVjQWMpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX1NUQVBrdFBlbmRpbmciKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU1RBUGt0UGVuZGluZyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX1NUQVBrdFBlbmRpbmciKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUZW1wb3JhcnkgZml4IHRvIGVuYWJsZSBUTCB0byBmZXRjaCBwYWNrZXRzIHdoZW4gbXVsdGlwbGUgcGVlcnMgam9pbgogICAgYW4gSUJTUy4gVG8gZml4IENSMTc3MzAxLiBOZWVkcyB0byBnbyBhd2F5IHdoZW4gdGhlIGFjdHVhbCBmaXggb2YKICAgIGdvaW5nIHRocm91Z2ggYWxsIFNUQSdzIGluIHJvdW5kIHJvYmluIGZhc2hpb24gZ2V0cyBtZXJnZWQgaW4gZnJvbQogICAgQlQgQU1QIGJyYW5jaC4KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYi0+dWNSZWdpc3RlcmVkU3RhSWQgPSB1Y1NUQUlkOwoKICBpZiggV0xBTlRMX1NUQV9DT05ORUNURUQgPT0gcENsaWVudFNUQS0+dGxTdGF0ZSApCiAgeyAvKiBFQVBPTF9ISV9QUklPUklUWSA6IG5lZWQgdG8gZmluZCBvdXQgd2hldGhlciBFQVBPTCBpcyBwZW5kaW5nIGJlZm9yZQogICAgICAgV0xBTlRMX0ZldGNoUGFja2V0KCkvV0xBTlRMX1R4Q29ubigpIGlzIGNhbGxlZC4KICAgICAgIGNoYW5nZSBTVEFfQVVUSEVOVElDQVRFRCAhPSB0bFN0YXRlIHRvIENPTk5FQ1RFRCA9PSB0bFN0YXRlCiAgICAgICB0byBtYWtlIHN1cmUgVEwgaXMgaW5kZWVkIHdhaXRpbmcgZm9yIEVBUE9MLgogICAgICAgSnVzdCBpbiB0aGUgY2FzZSB3aGVuIFNUQSBnb3QgZGlzY29ubmVjdGVkIHNob3J0bHkgYWZ0ZXIgY29ubmVjdGVjdGlvbiAqLwogICAgcENsaWVudFNUQS0+dWNFYXBvbFBrdFBlbmRpbmcgPSAxOwoKICAgIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwKICAgICAgICAgICBUUkFDRV9DT0RFX1RMX0VBUE9MX1BLVF9QRU5ESU5HLCB1Y1NUQUlkLCB1Y0FjKSk7CgogICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAiV0xBTiBUTDpQYWNrZXQgcGVuZGluZyBpbmRpY2F0aW9uIGZvciBTVEE6ICVkIEFDOiAlZCBTdGF0ZTogJWQiLCAKICAgICAgICAgICAgICAgdWNTVEFJZCwgdWNBYywgcENsaWVudFNUQS0+dGxTdGF0ZSk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFbmFibGUgdGhpcyBBQyBpbiB0aGUgQUMgbWFzayBpbiBvcmRlciBmb3IgVEwgdG8gc3RhcnQgc2VydmljaW5nIGl0CiAgICBTZXQgcGFja2V0IHBlbmRpbmcgZmxhZyAKICAgIFRvIGF2b2lkIHJhY2UgY29uZGl0aW9uLCBzZXJpYWxpemUgdGhlIHVwZGF0aW9uIG9mIEFDIGFuZCBBQyBtYXNrIAogICAgdGhyb3VnaCBXTEFOVExfVFhfU1RBSURfQUNfSU5EIG1lc3NhZ2UuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICAgcENsaWVudFNUQS0+YXVjQUNNYXNrW3VjQWNdID0gMTsKCiAgICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcENsaWVudFNUQS0+dWNQa3RQZW5kaW5nLCAxKTsKCiAgICAgIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwgVFJBQ0VfQ09ERV9UTF9TVEFfUEtUX1BFTkRJTkcsIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgKHBUTENiLT51Y1R4U3VzcGVuZGVkIDw8IDMxKSB8CiAgICAgICAgICAgICAgICAgICAgICAgKChwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfREFUQSkgPDwgMzApIHwKICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT50bFN0YXRlKSk7CgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIENoZWNrIGlmIHRoZXJlIGFyZSBlbm91Z2ggcmVzb3VyY2VzIGZvciB0cmFuc21pc3Npb24gYW5kIHR4IGlzIG5vdAogICAgICAgIHN1c3BlbmRlZC4KICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgaWYgKCggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX0RBVEEgKSAmJgogICAgICAgICAgKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkpCiAgICAgIHsKCiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAiSXNzdWluZyBYbWl0IHN0YXJ0IHJlcXVlc3QgdG8gQkFMIikpOwogICAgICAgICAgIFdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICBObyBlcnJvciBjb2RlIGlzIHNlbnQgYmVjYXVzZSBUTCB3aWxsIHJlc3VtZSB0eCBhdXRvbm9tb3VzbHkgaWYKICAgICAgICAgIHJlc291cmNlcyBiZWNvbWUgYXZhaWxhYmxlIG9yIHR4IGdldHMgcmVzdW1lZAogICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgIldMQU4gVEw6UmVxdWVzdCB0byBzZW5kIGJ1dCBjb25kaXRpb24gbm90IG1ldC4gUmVzOiAlZCxTdXNwZW5kOiAlZCIsCiAgICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCwgcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKTsKICAgICAgfQogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU1RBUGt0UGVuZGluZyAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU2V0U1RBUHJpb3JpdHkKCiAgREVTQ1JJUFRJT04KCiAgICBUTCBleHBvc2VzIHRoaXMgQVBJIHRvIGFsbG93IHVwcGVyIGxheWVycyBhIHJvdWdoIGNvbnRyb2wgb3ZlciB0aGUKICAgIHByaW9yaXR5IG9mIHRyYW5zbWlzc2lvbiBmb3IgYSBnaXZlbiBzdGF0aW9uIHdoZW4gc3VwcG9ydGluZyBtdWx0aXBsZQogICAgY29ubmVjdGlvbnMuCgogIERFUEVOREVOQ0lFUwoKICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2hhbmdlIGluIHByaW9yaXR5IGNhbiBiZQogICAgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBmb3IgdGhlIFNUQSB0aGF0IGhhcyB0byBjaGFuZ2UgcHJpb3JpdHkKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TZXRTVEFQcmlvcml0eQooCiAgdl9QVk9JRF90ICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgICAgdWNTVEFJZCwKICBXTEFOVExfU1RBUHJpb3JpdHlUeXBlICAgdGxTVEFQcmkKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX1NldFNUQVByaW9yaXR5IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TZXRTVEFQcmlvcml0eSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX1NldFNUQVByaW9yaXR5IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmUtYW5hbGl6ZSBpZiBsb2NrIGlzIG5lZWRlZCB3aGVuIGFkZGluZyBtdWx0aXBsZSBzdGF0aW9ucwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpDaGFuZ2luZyBzdGF0ZSBmb3IgU1RBIFByaSBJRDogJWQgZnJvbSAlZCB0byAlZCIsCiAgICAgICAgICAgICB1Y1NUQUlkLCBwQ2xpZW50U1RBLT50bFByaSwgdGxTVEFQcmkpKTsKICBwQ2xpZW50U1RBLT50bFByaSA9IHRsU1RBUHJpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NldFNUQVByaW9yaXR5ICovCgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJTlRFUkFDVElPTiBXSVRIIEJBUAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50CgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgU01FIHRvIHJlZ2lzdGVyIGl0c2VsZiBhcyBjbGllbnQgZm9yIG5vbi1kYXRhIEJULUFNUCBwYWNrZXRzLgoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHBmblRsQkFQUnhGcm06ICBwb2ludGVyIHRvIHRoZSByZWNlaXZlIHByb2Nlc3Npbmcgcm91dGluZSBmb3Igbm9uLWRhdGEKICAgICAgICAgICAgICAgICAgICBCVC1BTVAgcGFja2V0cwogICAgcGZuRmx1c2hPcENvbXBsZXRlQ2I6CiAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY2FsbCBiYWNrIGZ1bmN0aW9uLCBmb3IgdGhlIEZsdXNoIG9wZXJhdGlvbgogICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24uCgoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBCQUwgY2xpZW50IHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9SZWdpc3RlckJBUENsaWVudAooCiAgdl9QVk9JRF90ICAgICAgICAgICAgICBwdm9zR0N0eCwKICBXTEFOVExfQkFQUnhDQlR5cGUgICAgIHBmblRsQkFQUnhGcm0sCiAgV0xBTlRMX0ZsdXNoT3BDb21wQ0JUeXBlICBwZm5GbHVzaE9wQ29tcGxldGVDYgopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBmblRsQkFQUnhGcm0gKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9SZWdpc3RlckJBUENsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoIE5VTEwgPT0gcGZuRmx1c2hPcENvbXBsZXRlQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgIkludmFsaWQgRmx1c2ggQ29tcGxldGUgQ2IgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBNYWtlIHN1cmUgdGhpcyBpcyB0aGUgZmlyc3QgcmVnaXN0cmF0aW9uIGF0dGVtcHQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIDAgIT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnVjRXhpc3RzICkKICB7CiAgICBwVExDYi0+dGxCQVBDbGllbnQudWNFeGlzdHMrKzsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpCQVAgY2xpZW50IHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZWdpc3RlciBzdGF0aW9uIHdpdGggVEwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgQkFQIENsaWVudCIgKSk7CgogIHBUTENiLT50bEJBUENsaWVudC51Y0V4aXN0cysrOwoKICBpZiAoIE5VTEwgIT0gcGZuVGxCQVBSeEZybSApIAogIHsKICAgIHBUTENiLT50bEJBUENsaWVudC5wZm5UbEJBUFJ4ICAgICAgICAgICAgID0gcGZuVGxCQVBSeEZybTsKICB9CgogIHBUTENiLT50bEJBUENsaWVudC5wZm5GbHVzaE9wQ29tcGxldGVDYiAgID0gcGZuRmx1c2hPcENvbXBsZXRlQ2I7CgogIHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgICAgID0gTlVMTDsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SZWdpc3RlckJBUENsaWVudCAqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1R4QkFQRnJtCgogIERFU0NSSVBUSU9OCiAgICBCQVAgY2FsbHMgdGhpcyB3aGVuIGl0IHdhbnRzIHRvIHNlbmQgYSBmcmFtZSB0byB0aGUgbW9kdWxlCgogIERFUEVOREVOQ0lFUwogICAgQkFQIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogICAgUkVTVFJJQ1RJT046IEJBUCBDQU5OT1QgcHVzaCBhbnkgcGFja2V0cyB0byBUTCB1bnRpbCBpdCBkaWQgbm90IHJlY2VpdmUKICAgICAgICAgICAgICAgICBhIHR4IGNvbXBsZXRlIGZyb20gdGhlIHByZXZpb3VzIHBhY2tldCwgdGhhdCBtZWFucyBCQVAKICAgICAgICAgICAgICAgICBzZW5kcyBvbmUgcGFja2V0LCB3YWl0IGZvciB0eCBjb21wbGV0ZSBhbmQgdGhlbgogICAgICAgICAgICAgICAgIHNlbmRzIGFub3RoZXIgb25lCgogICAgICAgICAgICAgICAgIElmIEJBUCBzZW5kcyBhbm90aGVyIHBhY2tldCBiZWZvcmUgVEwgbWFuYWdlcyB0byBwcm9jZXNzIHRoZQogICAgICAgICAgICAgICAgIHByZXZpb3VzbHkgc2VudCBwYWNrZXQgY2FsbCB3aWxsIGVuZCBpbiBmYWlsdXJlCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIEJBUCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSB2T1NTIGJ1ZmZlciBjb250YWluaW5nIHRoZSBwYWNrZXQgdG8gYmUKICAgICAgICAgICAgICAgICAgICB0cmFuc21pdHRlZAogICAgcE1ldGFJbmZvOiAgICAgIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhY2tldAogICAgcGZuVGxCQVBUeENvbXA6IHBvaW50ZXIgdG8gYSB0cmFuc21pdCBjb21wbGV0ZSByb3V0aW5lIGZvciBub3RpZnlpbmcKICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gb3ZlciB0aGUgYnVzCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogQkFMIGNsaWVudCB3YXMgbm90IHlldCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX0VfQlVTWTogICBUaGUgcHJldmlvdXMgQlQtQU1QIHBhY2tldCB3YXMgbm90IHlldCB0cmFuc21pdHRlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICAgT3RoZXIgZmFpbHVyZSBtZXNzYWdlcyBtYXkgYmUgcmV0dXJuZWQgZnJvbSB0aGUgQkQgaGVhZGVyIGhhbmRsaW5nCiAgICByb3V0aW5lcywgcGxlYXNlIGNoZWNrIGFwcm9wcmlhdGUgQVBJIGZvciBtb3JlIGluZm8uCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1R4QkFQRnJtCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICAgICAgICAgICB2b3NEYXRhQnVmZiwKICBXTEFOVExfTWV0YUluZm9UeXBlKiAgICBwTWV0YUluZm8sCiAgV0xBTlRMX1R4Q29tcENCVHlwZSAgICAgcGZuVGxCQVBUeENvbXAKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiICAgICAgPSBOVUxMOwogIFZPU19TVEFUVVMgICAgICB2b3NTdGF0dXMgID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIHZfTUFDQUREUl90ICAgICB2RGVzdE1hY0FkZHI7CiAgdl9VMTZfdCAgICAgICAgIHVzUGt0TGVuOwogIHZfVThfdCAgICAgICAgICB1Y1N0YUlkID0gMDsKICB2X1U4X3QgICAgICAgICAgZXh0cmFIZWFkU3BhY2UgPSAwOwogIHZfVThfdCAgICAgICAgICB1Y1dEU0VuYWJsZWQgPSAwOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfVHhCQVBGcm0iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEVuc3VyZSB0aGF0IEJBUCBjbGllbnQgd2FzIHJlZ2lzdGVyZWQgcHJldmlvdXNseQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIDAgPT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnVjRXhpc3RzICkgfHwKICAgICAgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQocFRMQ2ItPnRsQkFQQ2xpZW50LnVjQkFQU1RBSWQpICkpCiAgewogICAgcFRMQ2ItPnRsQkFQQ2xpZW50LnVjRXhpc3RzKys7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkJBUCBjbGllbnQgbm90IHJlZ2lzdGVyIG9uIFdMQU5UTF9UeEJBUEZybSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgQ2hlY2sgaWYgYW55IEJULUFNUCBGcm0gaXMgcGVuZGluZwogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMICE9IHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDpCVC1BTVAgRnJhbWUgYWxyZWFkeSBwZW5kaW5nIHR4IGluIFRMIG9uIFdMQU5UTF9UeEJBUEZybSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfQlVTWTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYXZlIGJ1ZmZlciBhbmQgbm90aWZ5IEJBTDsgbm8gbG9jayBpcyBuZWVkZWQgaWYgdGhlIGFib3ZlIHJlc3RyaWN0aW9uCiAgICBpcyBtZXQKICAgIFNhdmUgdGhlIHR4IGNvbXBsZXRlIGZuY3QgcG9pbnRlciBhcyB0bCBzcGVjaWZpYyBkYXRhIGluIHRoZSB2b3MgYnVmZmVyCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUcmFuc2xhdGUgODAyLjMgZnJhbWUgdG8gODAyLjExCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdWNTdGFJZCA9IHBUTENiLT50bEJBUENsaWVudC51Y0JBUFNUQUlkOwogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXSApCiAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KICBpZiAoKCAwID09IHBNZXRhSW5mby0+dWNEaXNhYmxlRnJtWHRsICkgJiYgCiAgICAgICggMCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXS0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uICkpCiAgewogICAgdm9zU3RhdHVzID0gIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciggdm9zRGF0YUJ1ZmYsICZ2b3NTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYiwgJnVjU3RhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWV0YUluZm8sICZ1Y1dEU0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0cmFIZWFkU3BhY2UpOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOkVycm9yIHdoZW4gdHJhbnNsYXRpbmcgaGVhZGVyIFdMQU5UTF9UeEJBUEZybSIpKTsKCiAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CgogICAgcE1ldGFJbmZvLT51Y0Rpc2FibGVGcm1YdGwgPSAxOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDYWxsIEhBTCB0byBmaWxsIEJEIGhlYWRlcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgLyogQWRkaW5nIFR5cGUsIFN1YlR5cGUgd2hpY2ggd2FzIG1pc3NpbmcgZm9yIEVBUE9MIGZyb20gQkFQICovCiAgcE1ldGFJbmZvLT51Y1R5cGUgfD0gKFdMQU5UTF84MDIxMV9EQVRBX1RZUEUgPDwgNCk7CiAgcE1ldGFJbmZvLT51Y1R5cGUgfD0gKFdMQU5UTF84MDIxMV9EQVRBX1FPU19TVUJUWVBFKTsKCiAgdm9zU3RhdHVzID0gV0RBX0RTX0J1aWxkVHhQYWNrZXRJbmZvKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYgLCAKICAgICAgICAgICAgICAgICAgICAmdkRlc3RNYWNBZGRyLCBwTWV0YUluZm8tPnVjRGlzYWJsZUZybVh0bCwgCiAgICAgICAgICAgICAgICAgICAgJnVzUGt0TGVuLCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXS0+d1NUQURlc2MudWNRb3NFbmFibGVkLAogICAgICAgICAgICAgICAgICAgIHVjV0RTRW5hYmxlZCwgZXh0cmFIZWFkU3BhY2UsIHBNZXRhSW5mby0+dWNUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdLT53U1RBRGVzYy52U2VsZk1BQ0FkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgcE1ldGFJbmZvLT51Y1RJRCwgMCAvKiBObyBBQ0sgKi8sIHBNZXRhSW5mby0+dXNUaW1lU3RhbXAsCiAgICAgICAgICAgICAgICAgICAgcE1ldGFJbmZvLT51Y0lzRWFwb2wgfHwgcE1ldGFJbmZvLT51Y0lzV2FpLCBwTWV0YUluZm8tPnVjVVAgKTsKCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBidWlsZGluZyBUWCBoZWFkZXIgJWQiLCB2b3NTdGF0dXMpKTsKICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICBpZiAoIE5VTEwgIT0gcGZuVGxCQVBUeENvbXAgKQogIHsKICAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpcGZuVGxCQVBUeENvbXApOwogIH0KICBlbHNlCiAgewogICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClXTEFOVExfVHhDb21wRGVmYXVsdENiKTsKCiAgfQoKICB2b3NfYXRvbWljX3NldCggKHVpbnRwdHJfdCopJnBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAodWludHB0cl90KXZvc0RhdGFCdWZmKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIHRocmUgYXJlIGVub3VnaCByZXNvdXJjZXMgZm9yIHRyYW5zbWlzc2lvbiBhbmQgdHggaXMgbm90CiAgICBzdXNwZW5kZWQuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX0JBUCApICYmCiAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApKQogIHsKICAgIFdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOwogIH0KICBlbHNlCiAgewogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgTm8gZXJyb3IgY29kZSBpcyBzZW50IGJlY2F1c2UgVEwgd2lsbCByZXN1bWUgdHggYXV0b25vbW91c2x5IGlmCiAgICAgIHJlc291cmNlcyBiZWNvbWUgYXZhaWxhYmxlIG9yIHR4IGdldHMgcmVzdW1lZAogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgIldMQU4gVEw6UmVxdWVzdCB0byBzZW5kIGZyb20gQkFQIGJ1dCBjb25kaXRpb24gbm90IG1ldC5SZXM6ICVkLCIKICAgICAgICAgICAgICAgICAiU3VzcGVuZDogJWQiLCBwVExDYi0+dVJlc0NvdW50LCBwVExDYi0+dWNUeFN1c3BlbmRlZCApKTsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfVHhCQVBGcm0gKi8KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIElOVEVSQUNUSU9OIFdJVEggU01FCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfR2V0UnNzaQoKICBERVNDUklQVElPTgogICAgVEwgd2lsbCBleHRyYWN0IHRoZSBSU1NJIGluZm9ybWF0aW9uIGZyb20gZXZlcnkgZGF0YSBwYWNrZXQgZnJvbSB0aGUKICAgIG9uZ29pbmcgdHJhZmZpYyBhbmQgd2lsbCBzdG9yZSBpdC4gSXQgd2lsbCBwcm92aWRlIHRoZSByZXN1bHQgdG8gU01FCiAgICB1cG9uIHJlcXVlc3QuCgogIERFUEVOREVOQ0lFUwoKICAgIFdBUk5JTkc6IHRoZSByZWFkIGFuZCB3cml0ZSBvZiB0aGlzIHZhbHVlIHdpbGwgbm90IGJlIHByb3RlY3RlZAogICAgICAgICAgICAgYnkgbG9ja3MsIHRoZXJlZm9yZSB0aGUgaW5mb3JtYXRpb24gb2J0YWluZWQgYWZ0ZXIgYSByZWFkCiAgICAgICAgICAgICBtaWdodCBub3QgYWx3YXlzIGJlIGNvbnNpc3RlbnQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFNNRSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgc3RhdGlvbiBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdGVkIHZhbHVlCgogICAgT1VUCiAgICBwdVJzc2k6ICAgICAgICAgdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIFJTU0kKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU1RBIHdhcyBub3QgeWV0IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9HZXRSc3NpCigKICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgdWNTVEFJZCwKICB2X1M3X3QqICAgICAgICAgIHBSc3NpCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBSc3NpICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0dldFJzc2kiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9HZXRSc3NpIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldFJzc2kiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0dldFJzc2kiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDb3B5IHdpbGwgbm90IGJlIGxvY2tlZDsgcGxlYXNlIHJlYWQgcmVzdHJpY3Rpb24KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZihwVExDYi0+aXNCTVBTIHx8IElTX0FDVElWRU1PREVfT0ZGTE9BRF9GRUFUVVJFX0VOQUJMRSkKICB7CiAgICAqcFJzc2kgPSBwQ2xpZW50U1RBLT5yc3NpQXZnQm1wczsKICAgIC8qIENoZWNrIElmIFJTU0kgaXMgemVybyBiZWNhdXNlIHdlIGFyZSByZWFkaW5nIHJzc0F2Z0JtcHMgdXBkYXRlZCBieSBIQUwgaW4gCiAgICBwcmV2aW91cyBHZXRTdGF0c1JlcXVlc3QuIEl0IG1heSBiZSB1cGRhdGVkIGFzIHplcm8gYnkgSGFsIGJlY2F1c2UgRW50ZXJCbXBzIAogICAgbWlnaHQgbm90IGhhdmUgaGFwcGVuZCBieSB0aGF0IHRpbWUuIEhlbmNlIHJlYWRpbmcgdGhlIG1vc3QgcmVjZW50IFJzc2kgCiAgICBjYWxjbHVhdGVkIGJ5IFRMKi8KICAgIGlmKDAgPT0gKnBSc3NpKQogICAgewogICAgICAqcFJzc2kgPSBwQ2xpZW50U1RBLT5yc3NpQXZnOwogICAgfQogIH0KICBlbHNlCiAgewogICAgKnBSc3NpID0gcENsaWVudFNUQS0+cnNzaUF2ZzsKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6V0xBTlRMX0dldFJzc2kgZm9yIFNUQTogJWQgUlNTSTogJWQlcyIsCiAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgKnBSc3NpLAogICAgICAgICAgICAgICAgICAgIHBUTENiLT5pc0JNUFMgPyAiIGluIEJNUFMiIDogIiIpKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9HZXRSc3NpICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRTbnIKCiAgREVTQ1JJUFRJT04KICAgIFRMIHdpbGwgZXh0cmFjdCB0aGUgU05SIGluZm9ybWF0aW9uIGZyb20gZXZlcnkgZGF0YSBwYWNrZXQgZnJvbSB0aGUKICAgIG9uZ29pbmcgdHJhZmZpYyBhbmQgd2lsbCBzdG9yZSBpdC4gSXQgd2lsbCBwcm92aWRlIHRoZSByZXN1bHQgdG8gU01FCiAgICB1cG9uIHJlcXVlc3QuCgogIERFUEVOREVOQ0lFUwoKICAgIFdBUk5JTkc6IHRoZSByZWFkIGFuZCB3cml0ZSBvZiB0aGlzIHZhbHVlIHdpbGwgbm90IGJlIHByb3RlY3RlZAogICAgICAgICAgICAgYnkgbG9ja3MsIHRoZXJlZm9yZSB0aGUgaW5mb3JtYXRpb24gb2J0YWluZWQgYWZ0ZXIgYSByZWFkCiAgICAgICAgICAgICBtaWdodCBub3QgYWx3YXlzIGJlIGNvbnNpc3RlbnQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFNNRSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgc3RhdGlvbiBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdGVkIHZhbHVlCgogICAgT1VUCiAgICBwU25yOiAgICAgICAgIHRoZSBhdmVyYWdlIHZhbHVlIG9mIHRoZSBTTlIKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU1RBIHdhcyBub3QgeWV0IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9HZXRTbnIKKAogIHRBTklfVTggICAgICAgICAgIHVjU1RBSWQsCiAgdEFOSV9TOCogICAgICAgICAgcFNucgopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmIChOVUxMID09IHBTbnIpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoV0xBTlRMX1NUQV9JRF9JTlZBTElEKHVjU1RBSWQpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9UTCwgTlVMTCkpOwogIGlmIChOVUxMID09IHBUTENiKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoTlVMTCA9PSBwQ2xpZW50U1RBKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENvcHkgd2lsbCBub3QgYmUgbG9ja2VkOyBwbGVhc2UgcmVhZCByZXN0cmljdGlvbgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmIChwVExDYi0+aXNCTVBTKQogIHsKICAgICpwU25yID0gcENsaWVudFNUQS0+c25yQXZnQm1wczsKICB9CiAgZWxzZQogIHsKICAgIC8qIFNOUiBpcyBhdmVyYWdlZCBvdmVyIFdMQU5UTF9NQVhfU05SX0RBVEFfU0FNUExFUywgaWYgdGhlcmUgYXJlIG5vdCBlbm91Z2gKICAgICAqIGRhdGEgc2FtcGxlcyAoc25yaWR4KSB0byBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgdGhlbiByZXR1cm4gdGhlCiAgICAgKiBhdmVyYWdlIGZvciB0aGUgd2luZG93IG9mIHByZXZvaXVzIDIwIHBhY2tldHMuIEFuZCBpZiB0aGVyZSBhcmVuJ3QKICAgICAqIGVub3VnaCBzYW1wbGVzIGFuZCB0aGUgYXZlcmFnZSBmb3IgcHJldmlvdXMgd2luZG93IG9mIDIwIHBhY2tldHMgaXMKICAgICAqIG5vdCBhdmFpbGFibGUgdGhlbiByZXR1cm4gYSBwcmVkZWZpbmVkIHZhbHVlCiAgICAgKgogICAgICogTk9URTogdGhlIFNOUl9IQUNLX0JNUFMgdmFsdWUgaXMgZGVmaW5lZCB0byAxMjcsIGRvY3VtZW50cyBmcm9tIEhXCiAgICAgKiB0ZWFtIHJldmVhbCB0aGF0IHRoZSBTTlIgdmFsdWUgaGFzIGEgY2VpbGluZyB3ZWxsIGJlbG93IDEyNyBkQm0sCiAgICAgKiBzbyBpZiBTTlIgaGFzIHZhbHVlIG9mIDEyNyB0aGUgdXNlcnNwYWNlIGFwcGxpY2F0aW9ucyBjYW4ga25vdyB0aGF0CiAgICAgKiB0aGUgU05SIGhhcyBub3QgYmVlbiBjb21wdXRlZCB5ZXQgYmVjYXVzZSBlbm91Z2ggZGF0YSB3YXMgbm90CiAgICAgKiBhdmFpbGFibGUgZm9yIFNOUiBjYWxjdWxhdGlvbgogICAgICovCiAgICBpZiAocENsaWVudFNUQS0+c25ySWR4ID4gKFdMQU5UTF9NQVhfU05SX0RBVEFfU0FNUExFUy8yKQogICAgICAgIHx8ICEocENsaWVudFNUQS0+cHJldlNuckF2ZykpCiAgICB7CiAgICAgICAqcFNuciA9IHBDbGllbnRTVEEtPnNuclN1bSAvIHBDbGllbnRTVEEtPnNucklkeDsKICAgIH0KICAgIGVsc2UgaWYgKHBDbGllbnRTVEEtPnByZXZTbnJBdmcpCiAgICB7CiAgICAgICAqcFNuciA9IHBDbGllbnRTVEEtPnByZXZTbnJBdmc7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAqcFNuciA9IFNOUl9IQUNLX0JNUFM7CiAgICB9CiAgfQoKICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgIldMQU4gVEw6V0xBTlRMX0dldFNuciBmb3IgU1RBOiAlZCBTTlI6ICVkJXMiLAogICAgICAgICAgICB1Y1NUQUlkLCAqcFNuciwKICAgICAgICAgICAgcFRMQ2ItPmlzQk1QUyA/ICIgaW4gQk1QUyIgOiAiIik7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfR2V0U25yICovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldExpbmtRdWFsaXR5CgogIERFU0NSSVBUSU9OCiAgICBUTCB3aWxsIGV4dHJhY3QgdGhlIFNOUiBpbmZvcm1hdGlvbiBmcm9tIGV2ZXJ5IGRhdGEgcGFja2V0IGZyb20gdGhlCiAgICBvbmdvaW5nIHRyYWZmaWMgYW5kIHdpbGwgc3RvcmUgaXQuIEl0IHdpbGwgcHJvdmlkZSB0aGUgcmVzdWx0IHRvIFNNRQogICAgdXBvbiByZXF1ZXN0LgoKICBERVBFTkRFTkNJRVMKCiAgICBXQVJOSU5HOiB0aGUgcmVhZCBhbmQgd3JpdGUgb2YgdGhpcyB2YWx1ZSB3aWxsIG5vdCBiZSBwcm90ZWN0ZWQKICAgICAgICAgICAgIGJ5IGxvY2tzLCB0aGVyZWZvcmUgdGhlIGluZm9ybWF0aW9uIG9idGFpbmVkIGFmdGVyIGEgcmVhZAogICAgICAgICAgICAgbWlnaHQgbm90IGFsd2F5cyBiZSBjb25zaXN0ZW50LgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZQoKICAgIE9VVAogICAgcHVMaW5rUXVhbGl0eTogICAgICAgICB0aGUgYXZlcmFnZSB2YWx1ZSBvZiB0aGUgU05SCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFNUQSB3YXMgbm90IHlldCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0TGlua1F1YWxpdHkKKAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKICB2X1UzMl90KiAgICAgICAgICAgICAgcHVMaW5rUXVhbGl0eQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwdUxpbmtRdWFsaXR5ICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0dldExpbmtRdWFsaXR5IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiSW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfR2V0TGlua1F1YWxpdHkiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiSW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldExpbmtRdWFsaXR5IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0dldExpbmtRdWFsaXR5IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ29weSB3aWxsIG5vdCBiZSBsb2NrZWQ7IHBsZWFzZSByZWFkIHJlc3RyaWN0aW9uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgKnB1TGlua1F1YWxpdHkgPSBwQ2xpZW50U1RBLT51TGlua1F1YWxpdHlBdmc7CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOVExfR2V0TGlua1F1YWxpdHkgZm9yIFNUQTogJWQgTGlua1F1YWxpdHk6ICVkIiwgdWNTVEFJZCwgKnB1TGlua1F1YWxpdHkpKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9HZXRMaW5rUXVhbGl0eSAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfRmx1c2hTdGFUSUQKCiAgREVTQ1JJUFRJT04KICAgIFRMIHByb3ZpZGVzIHRoaXMgQVBJIGFzIGFuIGludGVyZmFjZSB0byBTTUUgKEJBUCkgbGF5ZXIuIFRMIGludHVybiBwb3N0cyBhCiAgICBtZXNzYWdlIHRvIEhBTC4gVGhpcyBBUEkgaXMgY2FsbGVkIGJ5IHRoZSBTTUUgaW5vcmRlciB0byBwZXJmb3JtIGEgZmx1c2gKICAgIG9wZXJhdGlvbi4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFNNRSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgc3RhdGlvbiBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdGVkIHZhbHVlCiAgICB1Y1RpZDogICAgICAgICAgVHNwZWMgSUQgZm9yIHRoZSBuZXcgQkEgc2Vzc2lvbgoKICAgIE9VVAogICAgVGhlIHJlc3BvbnNlIGZvciB0aGlzIHBvc3QgaXMgcmVjZWl2ZWQgaW4gdGhlIG1haW4gdGhyZWFkLCB2aWEgYSByZXNwb25zZQogICAgbWVzc2FnZSBmcm9tIEhBTCB0byBUTC4KCiAgUkVUVVJOIFZBTFVFCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9GbHVzaFN0YVRJRAooCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgICB1Y1NUQUlkLAogIHZfVThfdCAgICAgICAgICAgICAgICB1Y1RpZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIHRwRmx1c2hBQ1JlcSBGbHVzaEFDUmVxUHRyID0gTlVMTDsKICB2b3NfbXNnX3Qgdm9zTWVzc2FnZTsKCgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiSW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfRmx1c2hTdGFUSUQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiSW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0ZsdXNoU3RhVElEIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9GbHVzaFN0YVRJRCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBXZSBuZWVkIHRvIHBvc3QgYSBtZXNzYWdlIHdpdGggdGhlIFNUQSwgVElEIHZhbHVlIHRvIEhBTC4gSEFMIHBlcmZvcm1zIHRoZSBmbHVzaAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRmx1c2hBQ1JlcVB0ciA9IHZvc19tZW1fbWFsbG9jKHNpemVvZih0Rmx1c2hBQ1JlcSkpOwoKICBpZiAoIE5VTEwgPT0gRmx1c2hBQ1JlcVB0ciApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOiBmYXRhbCBmYWlsdXJlLCBjYW5ub3QgYWxsb2NhdGUgRmx1c2ggUmVxIHN0cnVjdHVyZSIpKTsKICAgIFZPU19BU1NFUlQoMCk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOwogIH0KCiAgLy8gU3RhcnQgY29uc3RydWN0aW5nIHRoZSBtZXNzYWdlIGZvciBIQUwKICBGbHVzaEFDUmVxUHRyLT5tZXNnVHlwZSAgICA9IFNJUl9UTF9IQUxfRkxVU0hfQUNfUkVROwogIEZsdXNoQUNSZXFQdHItPm1lc2dMZW4gICAgID0gc2l6ZW9mKHRGbHVzaEFDUmVxKTsKICBGbHVzaEFDUmVxUHRyLT5tZXNnTGVuICAgICA9IHNpemVvZih0Rmx1c2hBQ1JlcSk7CiAgRmx1c2hBQ1JlcVB0ci0+dWNTVEFJZCA9IHVjU1RBSWQ7CiAgRmx1c2hBQ1JlcVB0ci0+dWNUaWQgPSB1Y1RpZDsKCiAgdm9zTWVzc2FnZS50eXBlICAgICAgICAgICAgPSBXREFfVExfRkxVU0hfQUNfUkVROwogIHZvc01lc3NhZ2UuYm9keXB0ciA9ICh2b2lkICopRmx1c2hBQ1JlcVB0cjsKCiAgdm9zX21xX3Bvc3RfbWVzc2FnZShWT1NfTVFfSURfV0RBLCAmdm9zTWVzc2FnZSk7CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgSU5URVJBQ1RJT04gV0lUSCBQRQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfdXBkYXRlU3Bvb2ZNYWNBZGRyCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgSEREIHRvIHVwZGF0ZSBtYWNhZGRyCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBBUEkgY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgVEwncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgc3Bvb2ZNYWNBZGRyOiAgICAgc3Bvb2ZlZCBtYWMgYWRkZXJlc3MKICAgIHNlbGZNYWNBZGRyOiAgICAgICAgc2VsZiBNYWMgQWRkcmVzcwoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF91cGRhdGVTcG9vZk1hY0FkZHIKKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfTUFDQUREUl90KiAgICAgICAgICAgIHNwb29mTWFjQWRkciwKICB2X01BQ0FERFJfdCogICAgICAgICAgICBzZWxmTWFjQWRkcgopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHNwb29mTWFjQWRkciB8fCBOVUxMID09IHNlbGZNYWNBZGRyKQogIHsKICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX3VwZGF0ZVNwb29mTWFjQWRkciIpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICB2b3NfbWVtX2NvcHkocFRMQ2ItPnNwb29mTWFjQWRkci5zZWxmTWFjLmJ5dGVzLCBzZWxmTWFjQWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX01BQ19BRERSRVNTX0xFTik7CiAgdm9zX21lbV9jb3B5KHBUTENiLT5zcG9vZk1hY0FkZHIuc3Bvb2ZNYWMuYnl0ZXMsIHNwb29mTWFjQWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX01BQ19BRERSRVNTX0xFTik7CgogIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgIlRMOiBTZWxmU1RBIG1hYyBBZGRyIGZvciBjdXJyZW50IFNjYW4gIk1BQ19BRERSRVNTX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgTUFDX0FERFJfQVJSQVkocFRMQ2ItPnNwb29mTWFjQWRkci5zZWxmTWFjLmJ5dGVzKSk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfdXBkYXRlU3Bvb2ZNYWNBZGRyICovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1JlZ2lzdGVyTWdtdEZybUNsaWVudAoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFBFIHRvIHJlZ2lzdGVyIGFzIGEgY2xpZW50IGZvciBtYW5hZ2VtZW50IGZyYW1lcyBkZWxpdmVyeS4KCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIEFQSSBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0bwogICAgICAgICAgICAgICAgICAgICAgICBUTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBwZm5UbE1nbXRGcm1SeDogICAgIHBvaW50ZXIgdG8gdGhlIHJlY2VpdmUgcHJvY2Vzc2luZyByb3V0aW5lIGZvcgogICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VtZW50IGZyYW1lcwoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IE1nbXQgRnJhbWUgY2xpZW50IHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9SZWdpc3Rlck1nbXRGcm1DbGllbnQKKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIFdMQU5UTF9NZ210RnJtUnhDQlR5cGUgIHBmblRsTWdtdEZybVJ4CikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcGZuVGxNZ210RnJtUnggKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9SZWdpc3Rlck1nbXRGcm1DbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIE1ha2Ugc3VyZSB0aGlzIGlzIHRoZSBmaXJzdCByZWdpc3RyYXRpb24gYXR0ZW1wdAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggMCAhPSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnVjRXhpc3RzICkKICB7CiAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnVjRXhpc3RzKys7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6TWFuYWdlbWVudCBmcmFtZSBjbGllbnQgd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlZ2lzdGVyIHN0YXRpb24gd2l0aCBUTAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICJXTEFOIFRMOlJlZ2lzdGVyaW5nIE1hbmFnZW1lbnQgRnJhbWUgQ2xpZW50IiApKTsKCiAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cysrOwoKICBpZiAoIE5VTEwgIT0gcGZuVGxNZ210RnJtUnggKQogIHsKICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQucGZuVGxNZ210RnJtUnggPSBwZm5UbE1nbXRGcm1SeDsKICB9CgogIHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmID0gTlVMTDsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SZWdpc3Rlck1nbXRGcm1DbGllbnQgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0RlUmVnaXN0ZXJNZ210RnJtQ2xpZW50CgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgUEUgdG8gZGVyZWdpc3RlciBhcyBhIGNsaWVudCBmb3IgbWFuYWdlbWVudCBmcmFtZXMgZGVsaXZlcnkuCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBBUEkgY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgVEwncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogTWdtdCBGcmFtZSBjbGllbnQgd2FzIG5ldmVyIHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9EZVJlZ2lzdGVyTWdtdEZybUNsaWVudAooCiAgdl9QVk9JRF90ICAgICAgICAgICAgICAgcHZvc0dDdHgKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIE1ha2Ugc3VyZSB0aGlzIGlzIHRoZSBmaXJzdCByZWdpc3RyYXRpb24gYXR0ZW1wdAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggMCA9PSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6TWFuYWdlbWVudCBmcmFtZSBjbGllbnQgd2FzIG5ldmVyIHJlZ2lzdGVyZWQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDbGVhciByZWdpc3RyYXRpb24gd2l0aCBUTAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICJXTEFOIFRMOkRlcmVnaXN0ZXJpbmcgTWFuYWdlbWVudCBGcmFtZSBDbGllbnQiICkpOwoKICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnBmblRsTWdtdEZybVJ4ID0gV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYjsKICBpZiAoIE5VTEwgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYpCiAgewogICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgIldMQU4gVEw6TWFuYWdlbWVudCBjYWNoZSBidWZmZXIgbm90IGVtcHR5IG9uIGRlcmVnaXN0ZXJpbmciCiAgICAgICAgICAgICAgICIgLSBkcm9wcGluZyBwYWNrZXQiICkpOwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmKTsKCiAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiA9IE5VTEw7IAogIH0KCiAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cyA9IDA7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUmVnaXN0ZXJNZ210RnJtQ2xpZW50ICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9UeE1nbXRGcm0KCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBQRSB3aGVuIGl0IHdhbnQgdG8gc2VuZCBvdXQgYSBtYW5hZ2VtZW50IGZyYW1lLgogICAgSEFMIHdpbGwgYWxzbyB1c2UgdGhpcyBBUEkgZm9yIHRoZSBmZXcgZnJhbWVzIGl0IHNlbmRzIG91dCwgdGhleSBhcmUgbm90CiAgICBtYW5hZ2VtZW50IGZyYW1lcyBob3dldmVyZSBpdCBpcyBhY2NlcHRlZCB0aGF0IGFuIGV4Y2VwdGlvbiB3aWxsIGJlCiAgICBhbGxvd2VkIE9OTFkgZm9yIHRoZSB1c2FnZSBvZiBIQUwuCiAgICBHZW5lcmljIGRhdGEgZnJhbWVzIFNIT1VMRCBOT1QgdHJhdmVsIHRocm91Z2ggdGhpcyBmdW5jdGlvbi4KCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIEFQSSBjYW4gYmUgY2FsbGVkLgoKICAgIFJFU1RSSUNUSU9OOiBJZiBQRSBzZW5kcyBhbm90aGVyIHBhY2tldCBiZWZvcmUgVEwgbWFuYWdlcyB0byBwcm9jZXNzIHRoZQogICAgICAgICAgICAgICAgIHByZXZpb3VzbHkgc2VudCBwYWNrZXQgY2FsbCB3aWxsIGVuZCBpbiBmYWlsdXJlCgogICAgICAgICAgICAgICAgIEZyYW1lcyBjb21taW5nIHRocm91Z2ggaGVyZSBtdXN0IGJlIDgwMi4xMSBmcmFtZXMsIGZyYW1lCiAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24gaW4gVU1BIHdpbGwgYmUgYXV0b21hdGljYWxseSBkaXNhYmxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0O2EgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdm9zRnJtQnVmOiAgICAgIHBvaW50ZXIgdG8gYSB2T1NTIGJ1ZmZlciBjb250YWluaW5nIHRoZSBtYW5hZ2VtZW50CiAgICAgICAgICAgICAgICAgICAgZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQKICAgIHVzRnJtTGVuOiAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBmcmFtZSB0byBiZSB0cmFuc21pdHRlZDsgaW5mb3JtYXRpb24KICAgICAgICAgICAgICAgICAgICBpcyBhbHJlYWR5IGluY2x1ZGVkIGluIHRoZSB2T1NTIGJ1ZmZlcgogICAgd0ZybVR5cGU6ICAgICAgIHRoZSB0eXBlIG9mIHRoZSBmcmFtZSBiZWluZyB0cmFuc21pdHRlZAogICAgdGlkOiAgICAgICAgICAgIHRpZCB1c2VkIHRvIHRyYW5zbWl0IHRoaXMgZnJhbWUKICAgIHBmbkNvbXBUeEZ1bmM6ICBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSB0cmFuc21pdCBjb21wbGV0ZSByb3V0aW5lCiAgICBwdkJESGVhZGVyOiAgICAgcG9pbnRlciB0byB0aGUgQkQgaGVhZGVyLCBpZiBOVUxMIGl0IG1lYW5zIGl0IHdhcyBub3QKICAgICAgICAgICAgICAgICAgICB5ZXQgY29uc3RydWN0ZWQgYW5kIGl0IGxpZXMgd2l0aGluIFRMJ3MgcmVzcG9uc2liaWxpdHkKICAgICAgICAgICAgICAgICAgICB0byBkbyBzbzsgaWYgbm90IE5VTEwgaXQgaXMgZXhwZWN0ZWQgdGhhdCBpdCB3YXMKICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IHBhY2tlZCBpbnNpZGUgdGhlIHZvcyBwYWNrZXQKICAgIHVjQWNrUmVzcG9uc2U6ICBmbGFnIG5vdGlmeWluZyBpdCBhbiBpbnRlcnJ1cHQgaXMgbmVlZGVkIGZvciB0aGUKICAgICAgICAgICAgICAgICAgICBhY2tub3dsZWRnZW1lbnQgcmVjZWl2ZWQgd2hlbiB0aGUgZnJhbWUgaXMgc2VudCBvdXQKICAgICAgICAgICAgICAgICAgICB0aGUgYWlyIGFuZCA7IHRoZSBpbnRlcnJ1cHQgd2lsbCBiZSBwcm9jZXNzZWQgYnkgSEFMLAogICAgICAgICAgICAgICAgICAgIG9ubHkgb25lIHN1Y2ggZnJhbWUgY2FuIGJlIHBlbmRpbmcgaW4gdGhlIHN5c3RlbSBhdAogICAgICAgICAgICAgICAgICAgIG9uZSB0aW1lLgoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBNZ210IEZyYW1lIGNsaWVudCB3YXMgbm90IHlldCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX0VfQlVTWTogICBUaGUgcHJldmlvdXMgTWdtdCBwYWNrZXQgd2FzIG5vdCB5ZXQgdHJhbnNtaXR0ZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICAgIE90aGVyIGZhaWx1cmUgbWVzc2FnZXMgbWF5IGJlIHJldHVybmVkIGZyb20gdGhlIEJEIGhlYWRlciBoYW5kbGluZwogICAgcm91dGluZXMsIHBsZWFzZSBjaGVjayBhcHJvcHJpYXRlIEFQSSBmb3IgbW9yZSBpbmZvLgoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeE1nbXRGcm0KKAogIHZfUFZPSURfdCAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCogICAgICAgICAgIHZvc0ZybUJ1ZiwKICB2X1UxNl90ICAgICAgICAgICAgICB1c0ZybUxlbiwKICB2X1U4X3QgICAgICAgICAgICAgICB3RnJtVHlwZSwKICB2X1U4X3QgICAgICAgICAgICAgICB1Y1RpZCwKICBXTEFOVExfVHhDb21wQ0JUeXBlICBwZm5Db21wVHhGdW5jLAogIHZfUFZPSURfdCAgICAgICAgICAgIHB2QkRIZWFkZXIsCiAgdl9VMzJfdCAgICAgICAgICAgICAgdWNBY2tSZXNwb25zZQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIHZfTUFDQUREUl90ICAgICB2RGVzdE1hY0FkZHI7CiAgVk9TX1NUQVRVUyAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICB2X1UxNl90ICAgICAgICAgdXNQa3RMZW47CiAgdl9VMzJfdCAgICAgICAgIHVzVGltZVN0YW1wID0gMDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSB2b3NGcm1CdWYgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfVHhNZ210RnJtIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9UeE1nbXRGcm0iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEVuc3VyZSB0aGF0IG1hbmFnZW1lbnQgZnJhbWUgY2xpZW50IHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIDAgPT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cyApCiAgewogICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cysrOwogICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgIldMQU4gVEw6TWFuYWdlbWVudCBGcmFtZSBjbGllbnQgbm90IHJlZ2lzdGVyIG9uIFdMQU5UTF9UeE1nbXRGcm0iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgYW55IE1nbXQgRnJtIGlzIHBlbmRpbmcKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAvL3Zvc1RlbXBCdWZmID0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmY7CiAgaWYgKCBOVUxMICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkKICB7CgogICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICJXTEFOIFRMOk1hbmFnZW1lbnQgRnJhbWUgYWxyZWFkeSBwZW5kaW5nIHR4IGluIFRMOiBmYWlsaW5nIG9sZCBvbmUiKSk7CgoKICAgIC8qRmFpbGluZyB0aGUgdHggZm9yIHRoZSBwcmV2aW91cyBwYWNrZXQgZW5xdWVkIGJ5IFBFKi8KICAgIC8vdm9zX2F0b21pY19zZXQoICh1aW50cHRyX3QqKSZwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKICAgIC8vICAgICAgICAgICAgICAgICAgICAodWludHB0cl90KU5VTEwpOwoKICAgIC8vdm9zX3BrdF9nZXRfdXNlcl9kYXRhX3B0ciggdm9zVGVtcEJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSZwZm5UeENvbXApOwoKICAgIC8qaXQgc2hvdWxkIG5ldmVyIGJlIE5VTEwgLSBkZWZhdWx0IGhhbmRsZXIgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgaWYgbm9uZSovCiAgICAvL2lmICggTlVMTCA9PSBwZm5UeENvbXAgKQogICAgLy97CiAgICAvLyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAvLyAgICAgICAgICAgICJOVUxMIHBvaW50ZXIgdG8gVHggQ29tcGxldGUgb24gV0xBTlRMX1R4TWdtdEZybSIpOwogICAgLy8gIFZPU19BU1NFUlQoMCk7CiAgICAvLyAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIC8vfQoKICAgIC8vcGZuVHhDb21wKCBwdm9zR0N0eCwgdm9zVGVtcEJ1ZmYsIFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgKTsKICAgIC8vcmV0dXJuIFZPU19TVEFUVVNfRV9CVVNZOwoKCiAgICAvL3BmbkNvbXBUeEZ1bmMoIHB2b3NHQ3R4LCB2b3NGcm1CdWYsIFZPU19TVEFUVVNfRV9SRVNPVVJDRVMpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9SRVNPVVJDRVM7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIEJEIGhlYWRlciB3YXMgYnVpbGQsIGlmIG5vdCBjb25zdHJ1Y3QKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHZCREhlYWRlciApCiAgewogICAgIHZfTUFDQUREUl90KiAgICAgcHZBZGRyMk1hY0FkZHI7CiAgICAgdl9VOF90ICAgdVFvc0hkciA9IFZPU19GQUxTRTsKCiAgICAgLyogR2V0IGFkZHJlc3MgMiBvZiBNYW5nZW1lbnQgRnJhbWUgdG8gZ2l2ZSB0byBXTEFOSEFMX0ZpbGxUeEJkICovCiAgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEoIHZvc0ZybUJ1ZiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9NQUNfQUREUl9BTElHTigxKSArIFZPU19NQUNfQUREUl9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSZwdkFkZHIyTWFjQWRkciwgVk9TX01BQ19BRERSX1NJWkUpOwoKICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgIHsKICAgICAgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGdldCBhZGRyMiAlZCIsIHZvc1N0YXR1cykpOwogICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICB9CgogICAgLyogRVNFIElBUFAvVERMUyBGcmFtZSB3aGljaCBhcmUgZGF0YSBmcmFtZXMgYnV0IHRlY2huaWNhbGx5IHVzZWQKICAgICAqIGZvciBtYW5hZ2VtZW50IGZ1bmN0aW9uYWxpdHkgY29tZXMgdGhyb3VnaCByb3V0ZS4KICAgICAqLwogICAgaWYgKFdMQU5UTF9JU19RT1NfREFUQV9GUkFNRSh3RnJtVHlwZSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB7CiAgICAgICAgdVFvc0hkciA9IFZPU19UUlVFOwogICAgfQoKICAgIGlmIChXTEFOVExfSVNfUFJPQkVfUkVRKHdGcm1UeXBlKSkKICAgIHsKICAgICAgICBpZiAoVk9TX1RSVUUgPT0gdm9zX21lbV9jb21wYXJlKCh2X1ZPSURfdCopIHB2QWRkcjJNYWNBZGRyLAogICAgICAgICAgICAodl9WT0lEX3QqKSAmcFRMQ2ItPnNwb29mTWFjQWRkci5zcG9vZk1hYywgVk9TX01BQ19BRERSRVNTX0xFTikpCiAgICAgICAgewogICAgICAgICAgICBwdkFkZHIyTWFjQWRkciA9ICh2X1BWT0lEX3QpcFRMQ2ItPnNwb29mTWFjQWRkci5zZWxmTWFjLmJ5dGVzOwogICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAgIlRMOiB1c2luZyBzZWxmIHN0YSBhZGRyIHRvIGdldCBzdGFpZHggZm9yIHNwb29mZWQgcHJvYmUgcmVxICIKICAgICAgICAgICAgICAgICAgICBNQUNfQUREUkVTU19TVFIsIE1BQ19BRERSX0FSUkFZKHB2QWRkcjJNYWNBZGRyLT5ieXRlcykpOwogICAgICAgIH0KICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgQ2FsbCBXREEgdG8gYnVpbGQgVFggaGVhZGVyCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICB2b3NTdGF0dXMgPSBXREFfRFNfQnVpbGRUeFBhY2tldEluZm8oIHB2b3NHQ3R4LCB2b3NGcm1CdWYgLCAmdkRlc3RNYWNBZGRyLCAKICAgICAgICAgICAgICAgICAgIDEgLyogYWx3YXlzIDgwMi4xMSBmcmFtZXMqLywgJnVzUGt0TGVuLCB1UW9zSGRyIC8qcW9zIG5vdCBlbmFibGVkICEhISovLCAKICAgICAgICAgICAgICAgICAgIDAgLyogV0RTIG9mZiAqLywgMCwgd0ZybVR5cGUsIHB2QWRkcjJNYWNBZGRyLCB1Y1RpZCwKICAgICAgICAgICAgICAgICAgIHVjQWNrUmVzcG9uc2UsIHVzVGltZVN0YW1wLCAwLCAwICk7CgoKICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpICkKICAgIHsKICAgICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gYnVpbGQgVFggaGVhZGVyICVkIiwgdm9zU3RhdHVzKSk7CiAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CiAgIH0vKiBpZiBCRCBoZWFkZXIgbm90IHByZXNlbnQgKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhdmUgYnVmZmVyIGFuZCBub3RpZnkgQkFMOyBubyBsb2NrIGlzIG5lZWRlZCBpZiB0aGUgYWJvdmUgcmVzdHJpY3Rpb24KICAgIGlzIG1ldAogICAgU2F2ZSB0aGUgdHggY29tcGxldGUgZm5jdCBwb2ludGVyIGFzIHRsIHNwZWNpZmljIGRhdGEgaW4gdGhlIHZvcyBidWZmZXIKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgIT0gcGZuQ29tcFR4RnVuYyApCiAgewogICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRnJtQnVmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpcGZuQ29tcFR4RnVuYyk7CiAgfQogIGVsc2UKICB7CiAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NGcm1CdWYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClXTEFOVExfVHhDb21wRGVmYXVsdENiKTsKCiAgfQogIHZvc19hdG9taWNfc2V0KCAodWludHB0cl90KikmcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAodWludHB0cl90KXZvc0ZybUJ1Zik7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiB0aHJlIGFyZSBlbm91Z2ggcmVzb3VyY2VzIGZvciB0cmFuc21pc3Npb24gYW5kIHR4IGlzIG5vdAogICAgc3VzcGVuZGVkLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX01GICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICJXTEFOIFRMOklzc3VpbmcgWG1pdCBzdGFydCByZXF1ZXN0IHRvIEJBTCBmb3IgTUdNVCIpKTsKICAgIHZvc1N0YXR1cyA9IFdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOwogICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykKICAgIHsKICAgICAgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICAiV0xBTiBUTDpXREFfRFNfU3RhcnRYbWl0IGZhaWxzLiB2b3NTdGF0dXMgJWQiLCB2b3NTdGF0dXMpKTsKICAgICAgIHZvc19hdG9taWNfc2V0KCAodWludHB0cl90KikmcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsMCk7CiAgICB9CiAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgCiAgfQogIGVsc2UKICB7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBObyBlcnJvciBjb2RlIGlzIHNlbnQgYmVjYXVzZSBUTCB3aWxsIHJlc3VtZSB0eCBhdXRvbm9tb3VzbHkgaWYKICAgICAgcmVzb3VyY2VzIGJlY29tZSBhdmFpbGFibGUgb3IgdHggZ2V0cyByZXN1bWVkCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgIldMQU4gVEw6UmVxdWVzdCB0byBzZW5kIGZvciBNZ210IEZybSBidXQgY29uZGl0aW9uIG5vdCBtZXQuIFJlczogJWQiLAogICAgICAgICAgICAgICBwVExDYi0+dVJlc0NvdW50KSk7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1R4TWdtdEZybSAqLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJTlRFUkFDVElPTiBXSVRIIEhBTAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1Jlc2V0Tm90aWZpY2F0aW9uCgogIERFU0NSSVBUSU9OCiAgICBIQUwgbm90aWZpZXMgVEwgd2hlbiB0aGUgbW9kdWxlIGlzIGJlaW5nIHJlc2V0LgogICAgQ3VycmVudGx5IG5vdCB1c2VkLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1Jlc2V0Tm90aWZpY2F0aW9uCigKICB2X1BWT0lEX3QgICBwdm9zR0N0eAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9SZXNldE5vdGlmaWNhdGlvbiIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBXTEFOVExfQ2xlYW5DQihwVExDYiwgMSAvKmVtcHR5IGFsbCBxdWV1ZXMgYW5kIHBlbmRpbmcgcGFja2V0cyovKTsKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1Jlc2V0Tm90aWZpY2F0aW9uICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TdXNwZW5kRGF0YVR4CgogIERFU0NSSVBUSU9OCiAgICBIQUwgY2FsbHMgdGhpcyBBUEkgd2hlbiBpdCB3aXNoZXMgdG8gc3VzcGVuZCB0cmFuc21pc3Npb24gZm9yIGEKICAgIHBhcnRpY3VsYXIgU1RBLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGUgbXVzdCBiZSBmaXJzdCByZWdpc3RlcmVkIHdpdGgKICAgIFRMIGJ5IEhERC4KCiAgICBSRVNUUklDVElPTjogIEluIGNhc2Ugb2YgYSBzdXNwZW5kLCB0aGUgZmxhZyB3cml0ZSBhbmQgcmVhZCB3aWxsIG5vdCBiZQogICAgICAgICAgICAgICAgICBsb2NrZWQ6IHdvcnN0IGNhc2Ugc2NlbmFyaW8gb25lIG1vcmUgcGFja2V0IGNhbiBnZXQKICAgICAgICAgICAgICAgICAgdGhyb3VnaCBiZWZvcmUgdGhlIGZsYWcgZ2V0cyB1cGRhdGVkICh3ZSBjYW4gbWFrZSB0aGlzCiAgICAgICAgICAgICAgICAgIHdyaXRlIGF0b21pYyBhcyB3ZWxsIHRvIGd1YXJhbnRlZSBjb25zaXN0ZW5jeSkKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHB1Y1NUQUlkOiAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyBtYWRlOwogICAgICAgICAgICAgICAgICAgIGEgdmFsdWUgb2YgTlVMTCBhc3N1bWVzIHN1c3BlbmQgb24gYWxsIGFjdGl2ZSBzdGF0aW9uCiAgICBwZm5TdXNwZW5kVHhDQjogcG9pbnRlciB0byB0aGUgc3VzcGVuZCByZXN1bHQgbm90aWZpY2F0aW9uIGluIGNhc2UgdGhlCiAgICAgICAgICAgICAgICAgICAgY2FsbCBpcyBhc3luY2hyb25vdXMKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiAgU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KClZPU19TVEFUVVMKV0xBTlRMX1N1c3BlbmREYXRhVHgKKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90KiAgICAgICAgICAgICAgICBwdWNTVEFJZCwKICBXTEFOVExfU3VzcGVuZENCVHlwZSAgIHBmblN1c3BlbmRUeAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIHZvc19tc2dfdCAgICAgICB2b3NNc2c7CgogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1N1c3BlbmREYXRhVHgiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIHRoZSB0eXBlIG9mIHJlcXVlc3Q6IGdlbmVyaWMgc3VzcGVuZCwgb3IgcGVyIHN0YXRpb24gc3VzcGVuZAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmIChOVUxMID09IHB1Y1NUQUlkKQogIHsKICAgIC8qIEdlbmVyYWwgU3VzcGVuZCBSZXF1ZXN0IHJlY2VpdmVkICovCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICJXTEFOIFRMOkdlbmVyYWwgc3VzcGVuZCByZXF1ZXN0ZWQiKSk7CiAgICB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT51Y1R4U3VzcGVuZGVkLCAxKTsKICAgIHZvc01zZy5yZXNlcnZlZCA9IFdMQU5fTUFYX1NUQV9DT1VOVDsKICB9CiAgZWxzZQogIHsKICAgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCAqcHVjU1RBSWQgKSApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCAlZCByZXF1ZXN0ZWQgb24gV0xBTlRMX1N1c3BlbmREYXRhVHgiLCAqcHVjU1RBSWQpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIH0KCiAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXSApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwVExDYi0+YXRsU1RBQ2xpZW50cyBwb2ludGVyIGZvciBTVEEgSWQgOiVkIG9uICIKICAgICAgICAgICAgIldMQU5UTF9TdXNwZW5kRGF0YVR4IiwgKnB1Y1NUQUlkKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjRXhpc3RzICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6U3RhdGlvbiAlZCB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfU3VzcGVuZERhdGFUeCIsICpwdWNTVEFJZCkpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICAgIH0KCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAiV0xBTiBUTDpTdXNwZW5kIHJlcXVlc3QgZm9yIHN0YXRpb246ICVkIiwgKnB1Y1NUQUlkKSk7CiAgICB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjVHhTdXNwZW5kZWQsIDEpOwogICAgdm9zTXNnLnJlc2VydmVkID0gKnB1Y1NUQUlkOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNlcmlhbGl6ZSByZXF1ZXN0IHRocm91Z2ggVFggdGhyZWFkCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zTXNnLnR5cGUgICAgID0gV0xBTlRMX1RYX1NJR19TVVNQRU5EOwogIHZvc01zZy5ib2R5cHRyICAgICA9ICh2X1BWT0lEX3QpcGZuU3VzcGVuZFR4OwoKICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsIFRSQUNFX0NPREVfVExfU1VTUEVORF9EQVRBX1RYLAogICAgICAgICAgICAgICAgICAgIHZvc01zZy5yZXNlcnZlZCAsIDAgKSk7CgogIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX3R4X21xX3NlcmlhbGl6ZSggVk9TX01RX0lEX1RMLCAmdm9zTXNnKSkpCiAgewogICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICIgJXMgZmFpbHMgdG8gcG9zdCBtZXNzYWdlIiwgX19mdW5jX18pOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TdXNwZW5kRGF0YVR4ICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9SZXN1bWVEYXRhVHgKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBIQUwgdG8gcmVzdW1lIGRhdGEgdHJhbnNtaXNzaW9uIGZvciBhIGdpdmVuIFNUQS4KCiAgICBXQVJOSU5HOiBJZiBhIHN0YXRpb24gd2FzIGluZGl2aWR1YWxseSBzdXNwZW5kZWQgYSBnbG9iYWwgcmVzdW1lIHdpbGwKICAgICAgICAgICAgIG5vdCByZXN1bWUgdGhhdCBzdGF0aW9uCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgcHVjU1RBSWQ6ICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gd2hpY2ggaXMgYmVpbmcgcmVzdW1lZDsgTlVMTAogICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZXMgaW50byBnbG9iYWwgcmVzdW1lCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiAgU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KClZPU19TVEFUVVMKV0xBTlRMX1Jlc3VtZURhdGFUeAooCiAgdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCiAgdl9VOF90KiAgICAgICAgcHVjU1RBSWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfUmVzdW1lRGF0YVR4IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayB0byBzZWUgdGhlIHR5cGUgb2YgcmVzdW1lCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHB1Y1NUQUlkICkKICB7CiAgICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsIFRSQUNFX0NPREVfVExfUkVTVU1FX0RBVEFfVFgsCiAgICAgICAgICAgICAgICAgICAgICA0MSAsIDAgKSk7CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAiV0xBTiBUTDpHZW5lcmFsIHJlc3VtZSByZXF1ZXN0ZWQiKSk7CiAgICB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT51Y1R4U3VzcGVuZGVkLCAwKTsKICB9CiAgZWxzZQogIHsKICAgIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwgVFJBQ0VfQ09ERV9UTF9SRVNVTUVfREFUQV9UWCwKICAgICAgICAgICAgICAgICAgICAgICpwdWNTVEFJZCAsIDAgKSk7CgogICAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoICpwdWNTVEFJZCApKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCAlZCByZXF1ZXN0ZWQgb24gV0xBTlRMX1Jlc3VtZURhdGFUeCIsICpwdWNTVEFJZCkpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfQoKICAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBUTENiLT5hdGxTVEFDbGllbnRzIHBvaW50ZXIgZm9yIFNUQSBJZCA6JWQgb24gIgogICAgICAgICAgICAiV0xBTlRMX1Jlc3VtZURhdGFUeCIsICpwdWNTVEFJZCkpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfQoKICAgIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0V4aXN0cyApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOlN0YXRpb24gJWQgd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX1Jlc3VtZURhdGFUeCIsICpwdWNTVEFJZCkpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICAgIH0KCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAiV0xBTiBUTDpSZXN1bWUgcmVxdWVzdCBmb3Igc3RhdGlvbjogJWQiLCAqcHVjU1RBSWQpKTsKICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNUeFN1c3BlbmRlZCwgMCk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVzdW1pbmcgdHJhbnNtaXNzaW9uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX01GICkgJiYKICAgICAgKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkpCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6UmVzdW1pbmcgdHJhbnNtaXNzaW9uIikpOwogICAgcmV0dXJuIFdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SZXN1bWVEYXRhVHggKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU3VzcGVuZENCCgogIERFU0NSSVBUSU9OCiAgICBDYWxsYmFjayBmdW5jdGlvbiBmb3Igc2VyaWFsaXppbmcgU3VzcGVuZCBzaWduYWwgdGhyb3VnaCBUeCB0aHJlYWQKCiAgREVQRU5ERU5DSUVTCiAgICBKdXN0IG5vdGlmeSBIQUwgdGhhdCBzdXNwZW5kIGluIFRMIGlzIGNvbXBsZXRlLgoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICBwVXNlckRhdGE6ICAgICAgdXNlciBkYXRhIHNlbnQgd2l0aCB0aGUgY2FsbGJhY2sKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1N1c3BlbmRDQgooCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIFdMQU5UTF9TdXNwZW5kQ0JUeXBlICBwZm5TdXNwZW5kQ0IsCiAgdl9VMTZfdCAgICAgICAgICAgICAgIHVzUmVzZXJ2ZWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiICAgPSBOVUxMOwogIHZfVThfdCAgICAgICAgICB1Y1NUQUlkID0gKHZfVThfdCl1c1Jlc2VydmVkOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBmblN1c3BlbmRDQiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBObyBDYWxsIGJhY2sgcHJvY2Vzc2luZyByZXF1ZXN0ZWQgV0xBTlRMX1N1c3BlbmRDQiIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1N1c3BlbmRDQiIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBwZm5TdXNwZW5kQ0IocHZvc0dDdHgsIE5VTEwsIFZPU19TVEFUVVNfU1VDQ0VTUyk7CiAgfQogIGVsc2UKICB7CiAgICBwZm5TdXNwZW5kQ0IocHZvc0dDdHgsICZ1Y1NUQUlkLCBWT1NfU1RBVFVTX1NVQ0NFU1MpOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qV0xBTlRMX1N1c3BlbmRDQiovCgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDTElFTlQgSU5ERVBFTkRFTlQgSU5URVJGQUNFCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfR2V0VHhQa3RDb3VudAoKICBERVNDUklQVElPTgogICAgVEwgd2lsbCBwcm92aWRlIHRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgcGFja2V0cyBjb3VudGVkIHBlcgogICAgU1RBIHBlciBUSUQuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24KICAgIHVjVGlkOiAgICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSB0c3BlYwoKICAgIE9VVAogICAgcHVUeFBrdENvdW50OiAgIHRoZSBudW1iZXIgb2YgcGFja2V0cyB0eCBwYWNrZXQgZm9yIHRoaXMgU1RBIGFuZCBUSUQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiAgU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0VHhQa3RDb3VudAooCiAgdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgdWNTVEFJZCwKICB2X1U4X3QgICAgICAgICB1Y1RpZCwKICB2X1UzMl90KiAgICAgICBwdVR4UGt0Q291bnQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwdVR4UGt0Q291bnQgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0VHhQa3RDb3VudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApIHx8IFdMQU5UTF9USURfSU5WQUxJRCggdWNUaWQpICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkICVkL3RpZCAlZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0dldFR4UGt0Q291bnQiLAogICAgICAgICAgICB1Y1NUQUlkLCB1Y1RpZCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGlmIHN0YXRpb24gZXhpc3RzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfR2V0VHhQa3RDb3VudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0dldFR4UGt0Q291bnQgJWQiLAogICAgIHVjU1RBSWQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJldHVybiBkYXRhCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgLy9WT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCwKICAgIC8vICAgICAgICAgIldMQU4gVEw6UmVxdWVzdGVkIHR4IHBhY2tldCBjb3VudCBmb3IgU1RBOiAlZCwgVElEOiAlZCIsIAogICAgICAvLyAgICAgICAgIHVjU1RBSWQsIHVjVGlkKTsKCiAgKnB1VHhQa3RDb3VudCA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5hdVR4Q291bnRbdWNUaWRdOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0dldFR4UGt0Q291bnQgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFJ4UGt0Q291bnQKCiAgREVTQ1JJUFRJT04KICAgIFRMIHdpbGwgcHJvdmlkZSB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIHBhY2tldHMgY291bnRlZCBwZXIKICAgIFNUQSBwZXIgVElELgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uCiAgICB1Y1RpZDogICAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgdHNwZWMKCiAgIE9VVAogICAgcHVUeFBrdENvdW50OiAgIHRoZSBudW1iZXIgb2YgcGFja2V0cyByeCBwYWNrZXQgZm9yIHRoaXMgU1RBIGFuZCBUSUQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiAgU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0UnhQa3RDb3VudAooCiAgdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgdWNTVEFJZCwKICB2X1U4X3QgICAgICAgICB1Y1RpZCwKICB2X1UzMl90KiAgICAgICBwdVJ4UGt0Q291bnQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHVSeFBrdENvdW50ICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0dldFJ4UGt0Q291bnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSB8fCBXTEFOVExfVElEX0lOVkFMSUQoIHVjVGlkKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkICVkL3RpZCAlZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0dldFJ4UGt0Q291bnQiLAogICAgICAgICAgICAgdWNTVEFJZCwgdWNUaWQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldFJ4UGt0Q291bnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0dldFJ4UGt0Q291bnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZXR1cm4gZGF0YQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCwKICAgICAgICAgICAgIldMQU4gVEw6UmVxdWVzdGVkIHJ4IHBhY2tldCBjb3VudCBmb3IgU1RBOiAlZCwgVElEOiAlZCIsCiAgICAgICAgICAgICB1Y1NUQUlkLCB1Y1RpZCkpOwoKICAqcHVSeFBrdENvdW50ID0gcENsaWVudFNUQS0+YXVSeENvdW50W3VjVGlkXTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9HZXRSeFBrdENvdW50ICovCgpWT1NfU1RBVFVTCldMQU5UTF9UeEZDRnJhbWUKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eAopOwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgIFRMIElOVEVSTkFMIEFQSSBERUZJTklUSU9OCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfR2V0RnJhbWVzCgogIERFU0NSSVBUSU9OCgogICAgQkFMIGNhbGxzIHRoaXMgZnVuY3Rpb24gYXQgdGhlIHJlcXVlc3Qgb2YgdGhlIGxvd2VyIGJ1cyBpbnRlcmZhY2UuCiAgICBXaGVuIHRoaXMgcmVxdWVzdCBpcyBiZWluZyByZWNlaXZlZCBUTCB3aWxsIHJldHJpZXZlIHBhY2tldHMgZnJvbSBIREQKICAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgcHJpb3JpdHkgcnVsZXMgYW5kIHRoZSBjb3VudCBzdXBwbGllZCBieSBCQUwuCgogIERFUEVOREVOQ0lFUwoKICAgIEhERCBtdXN0IGhhdmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGF0IGxlYXN0IG9uZSBTVEEgYmVmb3JlIHRoaXMgZnVuY3Rpb24KICAgIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIEJBTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1U2l6ZTogICAgICAgICAgbWF4aW11bSBzaXplIGFjY2VwdGVkIGJ5IHRoZSBsb3dlciBsYXllcgogICAgdUZsb3dNYXNrICAgICAgIFRYIGZsb3cgY29udHJvbCBtYXNrIGZvciBQcmltYS4gRWFjaCBiaXQgaXMgZGVmaW5lZCBhcyAKICAgICAgICAgICAgICAgICAgICBXREFfVFhGbG93RW51bVR5cGUKCiAgICBPVVQKICAgIHZvc0RhdGFCdWZmOiAgIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ1ZmZlciBzdXBwbGllZAogICAgICAgICAgICAgICAgICAgIGJ5IFRMLCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBhY2tldCBzdXBwbGllZCwgVEwKICAgICAgICAgICAgICAgICAgICB3aWxsIGNoYWluIHRoZW0gdGhyb3VnaCB2T1NTIGJ1ZmZlcnMKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICAxIG9yIG1vcmU6IG51bWJlciBvZiByZXF1aXJlZCByZXNvdXJjZXMgaWYgdGhlcmUgYXJlIHN0aWxsIGZyYW1lcyB0byBmZXRjaAogICAgMCA6IGVycm9yIG9yIEhERCBxdWV1ZXMgYXJlIGRyYWluZWQKCiAgU0lERSBFRkZFQ1RTCgogIE5PVEUKICAgIAogICAgRmVhdHVyaXplZCB1Rmxvd01hc2suIElmIHdlIHdhbnQgdG8gcmVtb3ZlIGZlYXR1cml6YXRpb24sIHdlIG5lZWQgdG8gY2hhbmdlCiAgICBCQUwgb24gVm9sYW5zLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZfVTMyX3QKV0xBTlRMX0dldEZyYW1lcwooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCAgICAgKipwcEZyYW1lRGF0YUJ1ZmYsCiAgdl9VMzJfdCAgICAgICAgIHVTaXplLAogIHZfVThfdCAgICAgICAgICB1Rmxvd01hc2ssCiAgdl9CT09MX3QqICAgICAgIHBiVXJnZW50CikKewogICB2b3NfcGt0X3QqKiAgICAgICAgIHB2b3NEYXRhQnVmZiA9ICh2b3NfcGt0X3QqKilwcEZyYW1lRGF0YUJ1ZmY7CiAgIFdMQU5UTF9DYlR5cGUqICAgICAgcFRMQ2IgPSBOVUxMOwogICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgIHZfVTMyX3QgICAgICAgICAgICAgdVJlbWFpbmluZyA9IHVTaXplOwogICB2b3NfcGt0X3QqICAgICAgICAgIHZvc1Jvb3Q7CiAgIHZvc19wa3RfdCogICAgICAgICAgdm9zVGVtcEJ1ZjsKICAgV0xBTlRMX1NUQUZ1bmNUeXBlICBwZm5TVEFGc207CiAgIHZfVTE2X3QgICAgICAgICAgICAgdXNQa3RMZW47CiAgIHZfVTMyX3QgICAgICAgICAgICAgdVJlc0xlbjsKICAgdl9VOF90ICAgICAgICAgICAgICB1Y1NUQUlkOwogICB2X1U4X3QgICAgICAgICAgICAgIHVjQUM7CiAgIHZvc19wa3RfdCogICAgICAgICAgdm9zRGF0YUJ1ZmY7CiAgIHZfVTMyX3QgICAgICAgICAgICAgdVRvdGFsUGt0TGVuOwogICB2X1UzMl90ICAgICAgICAgICAgIGk9MDsKICAgdl9VMzJfdCAgICAgICAgICAgICBqPTA7CiAgIHZfVTMyX3QgICAgICAgICAgICAgdWNSZXN1bHQgPSAwOwogICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKICAgV0xBTlRMX1NUQUV2ZW50VHlwZSAgIHdTVEFFdmVudDsKICAgdEJzc1N5c3RlbVJvbGUgICAgICAgc3lzdGVtUm9sZTsKICAgdHBBbmlTaXJHbG9iYWwgcE1hYzsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgKCBOVUxMID09IHB2b3NEYXRhQnVmZiApKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIHVjUmVzdWx0OwogIH0KCiAgcE1hYyA9IHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1BFLCBwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBNYWMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwTWFjIiwgX19mdW5jX18pKTsKICAgIHJldHVybiB1Y1Jlc3VsdDsKICB9CgogIHZvc0RhdGFCdWZmID0gcFRMQ2ItPnZvc0R1bW15QnVmOyAvKiBKdXN0IHRvIGF2b2lkIGNoZWNraW5nIGZvciBOVUxMIGF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBpdGVyYXRpb24gKi8KCiAgcFRMQ2ItPnVSZXNDb3VudCA9IHVTaXplOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYXZlIHRoZSByb290IGFzIHdlIHdpbGwgd2FsayB0aGlzIGNoYWluIGFzIHdlIGZpbGwgaXQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc1Jvb3QgPSB2b3NEYXRhQnVmZjsKIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFRoZXJlIGlzIHN0aWxsIGRhdGEgLSB1bnRpbCBGU00gZnVuY3Rpb24gc2F5cyBvdGhlcndpc2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiLT5iVXJnZW50ICAgICAgPSBGQUxTRTsKCiAgd2hpbGUgKCggcFRMQ2ItPnRsQ29uZmlnSW5mby51TWluRnJhbWVzUHJvY1RocmVzIDwgcFRMQ2ItPnVSZXNDb3VudCApICYmCiAgICAgICAgICggMCA8IHVSZW1haW5pbmcgKSkKICB7CiAgICBzeXN0ZW1Sb2xlID0gd2RhR2V0R2xvYmFsU3lzdGVtUm9sZShwTWFjKTsKI2lmZGVmIFdMQU5fU09GVEFQX0ZMT1dDVFJMX0VOCi8qIEZJWE1FOiBUaGUgY29kZSBoYXMgYmVlbiBkaXNhYmxlZCBzaW5jZSBpdCBpcyBjcmVhdGluZyBpc3N1ZXMgaW4gcG93ZXIgc2F2ZSAqLwogICAgaWYgKGVTWVNURU1fQVBfUk9MRSA9PSBzeXN0ZW1Sb2xlKQogICAgewogICAgICAgaWYgKHBUTENiLT5kb25lX29uY2UgPT0gMCAmJiBOVUxMID09IHBUTENiLT52b3NUeEZDQnVmKQogICAgICAgewogICAgICAgICAgV0xBTlRMX1R4RkNGcmFtZSAocHZvc0dDdHgpOwogICAgICAgICAgcFRMQ2ItPmRvbmVfb25jZSArKzsKICAgICAgIH0KICAgIH0gCiAgICBpZiAoIE5VTEwgIT0gcFRMQ2ItPnZvc1R4RkNCdWYgKQogICAgewogICAgICAgLy90aGVyZSBpcyBmbG93IGNvbnRyb2wgcGFja2V0IHdhaXRpbmcgdG8gYmUgc2VudAogICAgICAgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggcFRMQ2ItPnZvc1R4RkNCdWYsIHVzUGt0TGVuLCB1UmVzTGVuLCB1VG90YWxQa3RMZW4pOwogICAgCiAgICAgICBpZiAoICggcFRMQ2ItPnVSZXNDb3VudCA+IHVSZXNMZW4gKSAmJgogICAgICAgICAgICAoIHVSZW1haW5pbmcgPiB1VG90YWxQa3RMZW4gKSAmJgogICAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0ZDICkgKSApCiAgICAgICB7CiAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2hhaW5pbmcgRkMgZnJhbWUgZmlyc3Qgb24gR2V0RnJhbWUiKSk7CgogICAgICAgICAgdm9zX3BrdF9jaGFpbl9wYWNrZXQoIHZvc0RhdGFCdWZmLCBwVExDYi0+dm9zVHhGQ0J1ZiwgMSAvKnRydWUqLyApOwoKICAgICAgICAgIHZvc19hdG9taWNfc2V0KCAodWludHB0cl90KikmcFRMQ2ItPnZvc1R4RkNCdWYsICh1aW50cHRyX3QpIE5VTEwpOwoKICAgICAgICAgIC8qRkMgZnJhbWVzIGNhbm5vdCBiZSBkZWxheWVkKi8KICAgICAgICAgIHBUTENiLT5iVXJnZW50ICAgICAgPSBUUlVFOwoKICAgICAgICAgIC8qVXBkYXRlIHJlbWFpbmluZyBsZW4gZnJvbSBTU0MgKi8KICAgICAgICAgIHVSZW1haW5pbmcgICAgICAgIC09ICh1c1BrdExlbiArIFdEQV9EWEVfSEVBREVSX1NJWkUpOwoKICAgICAgICAgIC8qVXBkYXRlIHJlc291cmNlIGNvdW50ICovCiAgICAgICAgICBwVExDYi0+dVJlc0NvdW50IC09IHVSZXNMZW47CiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOnNlbmQgZmMgb3V0IG9mIHNvdXJjZSAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgICB1Y1Jlc3VsdCA9ICggcFRMQ2ItPnVSZXNDb3VudCA+IHVSZXNMZW4gKT9WT1NfVFJVRTpWT1NfRkFMU0U7CiAgICAgICAgICBicmVhazsgLyogT3V0IG9mIHJlc291cmNlcyBvciByZWFjaGVkIG1heCBsZW4gKi8KICAgICAgIH0KICAgfQogICBlbHNlIAojZW5kaWYgLy9XTEFOX1NPRlRBUF9GTE9XQ1RSTF9FTgoKICAgIGlmICgoIE5VTEwgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKSAmJgogICAgICAgICggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfTUdNVCApICkgKQogICAgewogICAgICBXREFfVExJX1BST0NFU1NfRlJBTUVfTEVOKCBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICB1c1BrdExlbiwgdVJlc0xlbiwgdVRvdGFsUGt0TGVuKTsKCiAgICAgIGlmICh1c1BrdExlbiA+IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU4pCiAgICAgIHsKICAgICAgICAgIHVzUGt0TGVuID0gV0xBTlRMX01BWF9BTExPV0VEX0xFTjsKICAgICAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgIH0KCiAgICAgIGlmICggKCBwVExDYi0+dVJlc0NvdW50ID4gdVJlc0xlbiApICYmCiAgICAgICAgICAgKCB1UmVtYWluaW5nID4gdVRvdGFsUGt0TGVuICkgJiYKICAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX01HTVQgKSApICkKICAgICAgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDaGFpbmluZyBtYW5hZ2VtZW50IGZyYW1lIG9uIEdldEZyYW1lIikpOwoKICAgICAgICB2b3NfcGt0X2NoYWluX3BhY2tldCggdm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qdHJ1ZSovICk7CgogICAgICAgIHZvc19hdG9taWNfc2V0KCAodWludHB0cl90KikmcFRMQ2ItPnRsTWdtdEZybUNsaWVudC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1BlbmRpbmdEYXRhQnVmZiwgKHVpbnRwdHJfdClOVUxMKTsKCiAgICAgICAgLyptYW5hZ2VtZW50IGZyYW1lcyBjYW5ub3QgYmUgZGVsYXllZCovCiAgICAgICAgcFRMQ2ItPmJVcmdlbnQgICAgICA9IFRSVUU7CgogICAgICAgIC8qVXBkYXRlIHJlbWFpbmluZyBsZW4gZnJvbSBTU0MgKi8KICAgICAgICB1UmVtYWluaW5nICAgICAgICAtPSAodXNQa3RMZW4gKyBXREFfRFhFX0hFQURFUl9TSVpFKTsKCiAgICAgICAgLypVcGRhdGUgcmVzb3VyY2UgY291bnQgKi8KICAgICAgICBwVExDYi0+dVJlc0NvdW50IC09IHVSZXNMZW47CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdWNSZXN1bHQgPSAoIHBUTENiLT51UmVzQ291bnQgPiB1UmVzTGVuICk/Vk9TX1RSVUU6Vk9TX0ZBTFNFOwogICAgICAgIGJyZWFrOyAvKiBPdXQgb2YgcmVzb3VyY2VzIG9yIHJlYWNoZWQgbWF4IGxlbiAqLwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmICgoIHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKSAmJgogICAgICAgICAgICAgKCBXREFfVExJX01JTl9SRVNfQkFQIDw9IHBUTENiLT51UmVzQ291bnQgKSAmJgogICAgICAgICAgICAgKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkgICAgICAgICAgKQogICAgewogICAgICBXREFfVExJX1BST0NFU1NfRlJBTUVfTEVOKCBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVzUGt0TGVuLCB1UmVzTGVuLCB1VG90YWxQa3RMZW4pOwoKICAgICAgaWYgKHVzUGt0TGVuID4gV0xBTlRMX01BWF9BTExPV0VEX0xFTikKICAgICAgewogICAgICAgICAgdXNQa3RMZW4gPSBXTEFOVExfTUFYX0FMTE9XRURfTEVOOwogICAgICAgICAgVk9TX0FTU0VSVCgwKTsKICAgICAgfQoKICAgICAgaWYgKCAoIHBUTENiLT51UmVzQ291bnQgPiAodVJlc0xlbiArIFdEQV9UTElfTUlOX1JFU19NRiApICkgJiYKICAgICAgICAgICAoIHVSZW1haW5pbmcgPiB1VG90YWxQa3RMZW4gKSkKICAgICAgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDaGFpbmluZyBCVC1BTVAgZnJhbWUgb24gR2V0RnJhbWUiKSk7CgogICAgICAgIHZvc19wa3RfY2hhaW5fcGFja2V0KCB2b3NEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAvKnRydWUqLyApOwoKICAgICAgICAvKkJBUCBmcmFtZXMgY2Fubm90IGJlIGRlbGF5ZWQqLwogICAgICAgIHBUTENiLT5iVXJnZW50ICAgICAgPSBUUlVFOwoKICAgICAgICB2b3NfYXRvbWljX3NldCggKHVpbnRwdHJfdCopJnBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICh1aW50cHRyX3QpIE5VTEwpOwoKICAgICAgICAvKlVwZGF0ZSByZW1haW5pbmcgbGVuIGZyb20gU1NDICovCiAgICAgICAgdVJlbWFpbmluZyAgICAgICAgLT0gICh1c1BrdExlbiArIFdEQV9EWEVfSEVBREVSX1NJWkUpOwoKICAgICAgICAvKlVwZGF0ZSByZXNvdXJjZSBjb3VudCAqLwogICAgICAgIHBUTENiLT51UmVzQ291bnQgIC09IHVSZXNMZW47CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdWNSZXN1bHQgPSB1UmVzTGVuICsgV0RBX1RMSV9NSU5fUkVTX01GOwogICAgICAgIGJyZWFrOyAvKiBPdXQgb2YgcmVzb3VyY2VzIG9yIHJlYWNoZWQgbWF4IGxlbiAqLwogICAgICB9CiAgICB9CiAgICAvKiBub3RlOiB0aGlzIGZlYXR1cmUgaW1wbGVtZW50ZWQgb25seSBhZnRlciBXTEFOX0lOR0VUUkFURURfU09DICovCiAgICAvKiBzZWFyY2ggJ0VBUE9MX0hJX1BSSU9SSVRZJyB3aWxsIHNob3cgRUFQT0wgSElfUFJJT1JJVFkgY2hhbmdlIGluIFRMIGFuZCBXREkKICAgICAgIGJ5IGRlZmF1bHQsIEVBUE9MIHdpbGwgYmUgdHJlYXRlZCBhcyBoaWdoZXIgcHJpb3JpdHksIHdoaWNoIG1lYW5zCiAgICAgICB1c2UgbWdtdF9wb29sIGFuZCBEWEVfVFhfSEkgcHJvcml0eSBjaGFubmVsLgogICAgICAgdGhpcyBpcyBpbnRyb2R1Y2VkIHRvIGFkZHJlc3MgRUFQT0wgZmFpbHVyZSB1bmRlciBoaWdoIGJhY2tncm91bmQgdHJhZmZpYwogICAgICAgd2l0aCBtdWx0aS1jaGFubmVsIGNvbmN1cnJlbnQgbW9kZS4gQnV0IHRoaXMgY2hhbmdlIHdvcmtzIGluIFNDQyBvciBzdGFuZGFsb25lLCB0b28uCiAgICAgICBzZWUgQ1IjMzg3MDA5IGFuZCBXQ05TT1MtOAogICAgICovCiAgICBlbHNlIGlmICgoIFdEQV9UTElfTUlOX1JFU19NRiA8PSBwVExDYi0+dVJlc0NvdW50ICkmJgogICAgICAgICAgICAgKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkgJiYKICAgICAgICAgICAgICggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfTUdNVCApICkKICAgICAgICAgICAgKQogICAgewogICAgICAgIHZvc1RlbXBCdWYgPSBOVUxMOwogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIENoZWNrIHRvIHNlZSBpZiB0aGVyZSB3YXMgYW55IEVBUE9MIHBhY2tldCBpcyBwZW5kaW5nCiAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAgZm9yICggaSA9IDA7IGkgPCBXTEFOX01BWF9TVEFfQ09VTlQ7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgaWYgKChOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW2ldKSAmJgogICAgICAgICAgICAgICAocFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnVjRXhpc3RzKSAmJgogICAgICAgICAgICAgICAoMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dWNUeFN1c3BlbmRlZCkgJiYKICAgICAgICAgICAgICAgKFdMQU5UTF9TVEFfQ09OTkVDVEVEID09IHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT50bFN0YXRlKSAmJgogICAgICAgICAgICAgICAocFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnVjUGt0UGVuZGluZykKICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmIChpID49IFdMQU5fTUFYX1NUQV9DT1VOVCkKICAgICAgICB7CiAgICAgICAgICAgLyogTm8gTW9yZSB0byBTZXJ2ZSBFeGl0IEdldCBGcmFtZXMgKi8KICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLyogU2VydmUgRUFQT0wgZnJhbWUgd2l0aCBISV9GTE9XX01BU0sgKi8KICAgICAgICB1Y1NUQUlkID0gaTsKCiAgICAgICAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLAogICAgICAgICAgICAgICAgICAgVFJBQ0VfQ09ERV9UTF9HRVRfRlJBTUVTX0VBUE9MLCB1Y1NUQUlkLCBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dGxTdGF0ZSkpOwoKICAgICAgICBmb3IgKGogPSBXTEFOVExfTUFYX0FDIDsgaiA+IDA7IGotLSkKICAgICAgICB7CiAgICAgICAgICBpZiAoMCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+YXVjQUNNYXNrW2otMV0pCiAgICAgICAgICB7CiAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0N1cnJlbnRBQyA9IGotMTsKICAgICAgICAgICAgcFRMQ2ItPnVDdXJTZXJ2ZWRBQyA9IGotMTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgICAgICAgd1NUQUV2ZW50ID0gV0xBTlRMX1RYX0VWRU5UOwoKICAgICAgICBwZm5TVEFGc20gPSB0bFNUQUZzbVtwQ2xpZW50U1RBLT50bFN0YXRlXS4KICAgICAgICAgICAgICAgICAgICAgICAgcGZuU1RBVGJsW3dTVEFFdmVudF07CgogICAgICAgIGlmICggTlVMTCAhPSBwZm5TVEFGc20gKQogICAgICAgIHsKICAgICAgICAgIHBDbGllbnRTVEEtPnVjTm9Nb3JlRGF0YSA9IDA7CiAgICAgICAgICB2b3NTdGF0dXMgID0gcGZuU1RBRnNtKCBwdm9zR0N0eCwgdWNTVEFJZCwgJnZvc1RlbXBCdWYsIFZPU19GQUxTRSk7CgogICAgICAgICAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApICYmCiAgICAgICAgICAgICAgKCBOVUxMICE9IHZvc1RlbXBCdWYgKSkKICAgICAgICAgIHsKICAgICAgICAgICAgICAgcENsaWVudFNUQS0+cGZuU1RBVHhDb21wKCBwdm9zR0N0eCwgdm9zVGVtcEJ1Ziwgdm9zU3RhdHVzICk7CiAgICAgICAgICAgICAgIHZvc1RlbXBCdWYgPSBOVUxMOwogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0vKiBzdGF0dXMgc3VjY2VzcyovCiAgICAgICAgfQoKICAgICAgICBpZiAoTlVMTCAhPSB2b3NUZW1wQnVmKQogICAgICAgIHsKICAgICAgICAgICAgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggdm9zVGVtcEJ1ZiwgdXNQa3RMZW4sIHVSZXNMZW4sIHVUb3RhbFBrdExlbik7CgogICAgICAgICAgICBpZiAodXNQa3RMZW4gPiBXTEFOVExfTUFYX0FMTE9XRURfTEVOKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB1c1BrdExlbiA9IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU47CiAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKDApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpSZXNvdXJjZXMgbmVlZGVkIGJ5IGZyYW1lOiAlZCIsIHVSZXNMZW4pKTsKCiAgICAgICAgICAgIGlmICggKCBwVExDYi0+dVJlc0NvdW50ID49ICh1UmVzTGVuICsgV0RBX1RMSV9NSU5fUkVTX01GICkgKSAmJgogICAgICAgICAgICAgICAoIHVSZW1haW5pbmcgPiB1VG90YWxQa3RMZW4gKQogICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDaGFpbmluZyBkYXRhIGZyYW1lIG9uIEdldEZyYW1lIikpOwoKICAgICAgICAgICAgICB2b3NfcGt0X2NoYWluX3BhY2tldCggdm9zRGF0YUJ1ZmYsIHZvc1RlbXBCdWYsIDEgLyp0cnVlKi8gKTsKCiAgICAgICAgICAgICAgLypFQVBPTCBmcmFtZSBjYW5ub3QgYmUgZGVsYXllZCovCiAgICAgICAgICAgICAgcFRMQ2ItPmJVcmdlbnQgICAgICA9IFRSVUU7CgogICAgICAgICAgICAgIHZvc1RlbXBCdWYgPSAgTlVMTDsKCiAgICAgICAgICAgICAgLypVcGRhdGUgcmVtYWluaW5nIGxlbiBmcm9tIFNTQyAqLwogICAgICAgICAgICAgIHVSZW1haW5pbmcgIC09ICh1c1BrdExlbiArIFdEQV9EWEVfSEVBREVSX1NJWkUpOwoKICAgICAgICAgICAgICAgLypVcGRhdGUgcmVzb3VyY2UgY291bnQgKi8KICAgICAgICAgICAgICBwVExDYi0+dVJlc0NvdW50ICAtPSB1UmVzTGVuOwoKICAgICAgICAgICAgICAvL2ZvdyBjb250cm9sIHVwZGF0ZQogICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVJbmdyZXNzX2xlbmd0aCArPSB1UmVzTGVuOwogICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVCdWZmVGhyZXNob2xkTWF4ID0gKHBDbGllbnRTVEEtPnVCdWZmVGhyZXNob2xkTWF4ID49IHVSZXNMZW4pID8KICAgICAgICAgICAgICAgIChwQ2xpZW50U1RBLT51QnVmZlRocmVzaG9sZE1heCAtIHVSZXNMZW4pIDogMDsKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51Y0VhcG9sUGt0UGVuZGluZyA9IDA7CiAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgIldMQU4gVEw6R2V0RnJhbWVzIFNUQTogJWQgRUFQT0xQa3RQZW5kaW5nICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsIHBDbGllbnRTVEEtPnVjRWFwb2xQa3RQZW5kaW5nKTsKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgeyAgLy8gbm8gRUFQT0wgZnJhbWVzIGV4aXQgR2V0IGZyYW1lcwogICAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpHZXRGcmFtZXMgU1RBOiAlZCwgbm8gRUFQT0wgZnJhbWUsIGNvbnRpbnVlLiIsCiAgICAgICAgICAgICAgICAgICB1Y1NUQUlkKSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICB9CgogICAgZWxzZSBpZiAoKCBXREFfVExJX01JTl9SRVNfREFUQSA8PSBwVExDYi0+dVJlc0NvdW50ICkgJiYKICAgICAgICAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApICYmCiAgICAgICAgICAgICAoKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19BQ19CSyApICkgfHwKICAgICAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0FDX0JFICkgKSB8fAogICAgICAgICAgICAgICggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfQUNfVkkgKSApIHx8CiAgICAgICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19BQ19WTyApICkpICkKICAgIHsKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBDaGVjayB0byBzZWUgaWYgdGhlcmUgd2FzIGFueSBwYWNrZXQgbGVmdCBiZWhpbmQgcHJldmlvdXNseSBkdWUgdG8KICAgICAgICBzaXplIGNvbnN0cmFpbnRzCiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICB2b3NUZW1wQnVmID0gTlVMTDsKCiAgICAgIGlmICggTlVMTCAhPSBwVExDYi0+dm9zVGVtcEJ1ZiApIAogICAgICB7CiAgICAgICAgdm9zVGVtcEJ1ZiAgICAgICAgICA9IHBUTENiLT52b3NUZW1wQnVmOwogICAgICAgIHBUTENiLT52b3NUZW1wQnVmICAgPSBOVUxMOwogICAgICAgIHVjU1RBSWQgICAgICAgICAgICAgPSBwVExDYi0+dWNDYWNoZWRTVEFJZDsgCiAgICAgICAgdWNBQyAgICAgICAgICAgICAgICA9IHBUTENiLT51Y0NhY2hlZEFDOwoKICAgICAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjTm9Nb3JlRGF0YSA9IDA7CiAgICAgICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2hhaW5pbmcgY2FjaGVkIGRhdGEgZnJhbWUgb24gR2V0RnJhbWUiKSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgV0xBTl9UTEdldE5leHRUeElkcyggcHZvc0dDdHgsICZ1Y1NUQUlkKTsKICAgICAgICBpZiAodWNTVEFJZCA+PSBXTEFOX01BWF9TVEFfQ09VTlQpCiAgICAgICAgewogICAgICAgICAvKiBQYWNrZXRzIHN0YXJ0IGNvbWluZyBpbiBldmVuIGFmdGVyIGluc21vZCBXaXRob3V0ICoKICAgICAgICAgICAgc3RhcnRpbmcgSG9zdGFwZCBvciBJbnRlcmZhY2UgYmVpbmcgdXAgICAgICAgICAgICAqCiAgICAgICAgICAgIER1cmluZyB3aGljaCBjYXNlcyBTVEFJRCBpcyBpbnZhbGVkIGFuZCBoZW5jZSAKICAgICAgICAgICAgdGhlIGNoZWNrLiBIYWxNc2dfU2NuYUNvbXBsZXRlIFRyaWdnZXJzICovCgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLyogdWNDdXJyZW50QUMgc2hvdWxkIGhhdmUgY29ycmVjdCBBQyB0byBiZSBzZXJ2ZWQgYnkgY2FsbGluZwogICAgICAgICAgIFdMQU5fVExHZXROZXh0VHhJZHMgKi8KICAgICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CiAgICAgICAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgdWNBQyA9IHBDbGllbnRTVEEtPnVjQ3VycmVudEFDOwoKICAgICAgICBwQ2xpZW50U1RBLT51Y05vTW9yZURhdGEgPSAxOwogICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiAlcyBnZXQgb25lIGRhdGEgZnJhbWUsIHN0YXRpb24gSUQgJWQgIiwgX19mdW5jX18sIHVjU1RBSWQpKTsKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBDaGVjayB0byBzZWUgdGhhdCBTVEEgaXMgdmFsaWQgYW5kIHR4IGlzIG5vdCBzdXNwZW5kZWQKICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAgaWYgKCAoICEgV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKSAmJgogICAgICAgICAgICggMCA9PSBwQ2xpZW50U1RBLT51Y1R4U3VzcGVuZGVkICkgJiYKICAgICAgICAgICAoIDAgPT0gcENsaWVudFNUQS0+ZmNTdGFUeERpc2FibGVkKSApCiAgICAgICAgewogICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6ICVzIHN0YSBpZCB2YWxpZCBhbmQgbm90IHN1c3BlbmRlZCAiLF9fZnVuY19fKSk7CiAgICAgICAgICB3U1RBRXZlbnQgPSBXTEFOVExfVFhfRVZFTlQ7CgogICAgICAgICAgcGZuU1RBRnNtID0gdGxTVEFGc21bcENsaWVudFNUQS0+dGxTdGF0ZV0uCiAgICAgICAgICAgICAgICAgICAgICAgIHBmblNUQVRibFt3U1RBRXZlbnRdOwoKICAgICAgICAgIGlmICggTlVMTCAhPSBwZm5TVEFGc20gKQogICAgICAgICAgewogICAgICAgICAgICBwQ2xpZW50U1RBLT51Y05vTW9yZURhdGEgPSAwOwogICAgICAgICAgICB2b3NTdGF0dXMgID0gcGZuU1RBRnNtKCBwdm9zR0N0eCwgdWNTVEFJZCwgJnZvc1RlbXBCdWYsIFZPU19GQUxTRSk7CgogICAgICAgICAgICBpZiAoKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkgJiYKICAgICAgICAgICAgICAgICggTlVMTCAhPSB2b3NUZW1wQnVmICkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT5wZm5TVEFUeENvbXAoIHB2b3NHQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1N0YXR1cyApOwogICAgICAgICAgICAgICAgIHZvc1RlbXBCdWYgPSBOVUxMOwogICAgICAgICAgICB9Lyogc3RhdHVzIHN1Y2Nlc3MqLwogICAgICAgICAgfS8qTlVMTCBmdW5jdGlvbiBzdGF0ZSovCiAgICAgICAgfS8qIHZhbGlkIFNUQSBpZCBhbmQgISBzdXNwZW5kZWQqLwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgaWYgKCAhIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkgCiAgICAgICAgICAgewogICAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDpOb3QgZmV0Y2hpbmcgZnJhbWUgYmVjYXVzZSBzdXNwZW5kZWQgZm9yIHN0YSBJRCAlZCIsIAogICAgICAgICAgICAgICAgICAgdWNTVEFJZCkpOwogICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0vKiBkYXRhICovCgogICAgICBpZiAoIE5VTEwgIT0gdm9zVGVtcEJ1ZiApCiAgICAgIHsKICAgICAgICBXREFfVExJX1BST0NFU1NfRlJBTUVfTEVOKCB2b3NUZW1wQnVmLCB1c1BrdExlbiwgdVJlc0xlbiwgdVRvdGFsUGt0TGVuKTsKCiAgICAgICAgaWYgKHVzUGt0TGVuID4gV0xBTlRMX01BWF9BTExPV0VEX0xFTikKICAgICAgICB7CiAgICAgICAgICAgIHVzUGt0TGVuID0gV0xBTlRMX01BWF9BTExPV0VEX0xFTjsKICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKICAgICAgICB9CgogICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6UmVzb3VyY2VzIG5lZWRlZCBieSBmcmFtZTogJWQiLCB1UmVzTGVuKSk7CgogICAgICAgIGlmICggKCBwVExDYi0+dVJlc0NvdW50ID49ICh1UmVzTGVuICsgV0RBX1RMSV9NSU5fUkVTX0JBUCApICkgJiYKICAgICAgICAgICAgICggdVJlbWFpbmluZyA+IHVUb3RhbFBrdExlbiApICYmCiAgICAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCB1Y0FDICkgKSApCiAgICAgICAgewogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDaGFpbmluZyBkYXRhIGZyYW1lIG9uIEdldEZyYW1lIikpOwoKICAgICAgICAgIHZvc19wa3RfY2hhaW5fcGFja2V0KCB2b3NEYXRhQnVmZiwgdm9zVGVtcEJ1ZiwgMSAvKnRydWUqLyApOwogICAgICAgICAgdm9zVGVtcEJ1ZiA9ICBOVUxMOwoKICAgICAgICAgIC8qVXBkYXRlIHJlbWFpbmluZyBsZW4gZnJvbSBTU0MgKi8KICAgICAgICAgIHVSZW1haW5pbmcgICAgICAgIC09ICh1c1BrdExlbiArIFdEQV9EWEVfSEVBREVSX1NJWkUpOwoKICAgICAgICAgICAvKlVwZGF0ZSByZXNvdXJjZSBjb3VudCAqLwogICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCAgLT0gdVJlc0xlbjsKCiAgICAgICAgICAvL2ZvdyBjb250cm9sIHVwZGF0ZQogICAgICAgICAgcENsaWVudFNUQS0+dUluZ3Jlc3NfbGVuZ3RoICs9IHVSZXNMZW47CiAgICAgICAgICBwQ2xpZW50U1RBLT51QnVmZlRocmVzaG9sZE1heCA9IChwQ2xpZW50U1RBLT51QnVmZlRocmVzaG9sZE1heCA+PSB1UmVzTGVuKSA/CiAgICAgICAgICAgIChwQ2xpZW50U1RBLT51QnVmZlRocmVzaG9sZE1heCAtIHVSZXNMZW4pIDogMDsKCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAvKiBTdG9yZSB0aGlzIGZvciBsYXRlciB0eCAtIGFscmVhZHkgZmV0Y2hlZCBmcm9tIEhERCAqLwogICAgICAgICAgcFRMQ2ItPnZvc1RlbXBCdWYgPSB2b3NUZW1wQnVmOwogICAgICAgICAgcFRMQ2ItPnVjQ2FjaGVkU1RBSWQgPSB1Y1NUQUlkOwogICAgICAgICAgcFRMQ2ItPnVjQ2FjaGVkQUMgICAgPSB1Y0FDOwogICAgICAgICAgdWNSZXN1bHQgPSB1UmVzTGVuICsgV0RBX1RMSV9NSU5fUkVTX0JBUDsKICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJtaW4gJWQgcmVzIHJlcXVpcmVkIGJ5IFRMLiIsIHVjUmVzdWx0ICkpOwogICAgICAgICAgYnJlYWs7IC8qIE91dCBvZiByZXNvdXJjZXMgb3IgcmVhY2hlZCBtYXggbGVuICovCiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspCiAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW2ldICYmIChwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dWNFeGlzdHMpICYmCiAgICAgICAgICAgICAgICAgIChwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dWNQa3RQZW5kaW5nKSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIC8qIFRoZXJlIGlzIHN0YXRpb24gdG8gYmUgU2VydmVkICovCiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgICAgaWYgKGkgPj0gV0xBTl9NQVhfU1RBX0NPVU5UKQogICAgICAgICAgIHsKICAgICAgICAgICAgICAvKiBObyBNb3JlIHRvIFNlcnZlIEV4aXQgR2V0IEZyYW1lcyAqLwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlCiAgICAgICAgICAgewogICAgICAgICAgICAgIC8qIE1vcmUgdG8gYmUgU2VydmVkICovCiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgfQogICAgICAgIH0gCiAgICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlJldHVybmluZyBmcm9tIEdldEZyYW1lOiByZXNvdXJjZXMgPSAlZCBzdXNwZW5kZWQgPSAlZCIsCiAgICAgICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCwgcFRMQ2ItPnVjVHhTdXNwZW5kZWQpKTsKICAgICAgLyogVEwgaXMgc3RhcnZpbmcgZXZlbiB3aGVuIERYRSBpcyBub3QgaW4gbG93IHJlc291cmNlIGNvbmRpdGlvbiAKICAgICAgICAgUmV0dXJuIG1pbiByZXNvdXJjZSBudW1iZXIgcmVxdWlyZWQgYW5kIExldCBEWEUgZGVjZWlkZSB3aGF0IHRvIGRvICovCiAgICAgIGlmKCggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApICYmIAogICAgICAgICAoKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19BQ19CSyApICkgfHwgCiAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0FDX0JFICkgKSB8fAogICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19BQ19WSSApICkgfHwgCiAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0FDX1ZPICkgKSkpCiAgICAgIHsKICAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICJXTEFOIFRMOlJldHVybmluZyBmcm9tIEdldEZyYW1lOiByZXNvdXJjZXMgPSAlZCIsCiAgICAgICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCkpOwogICAgICAgICB1Y1Jlc3VsdCA9IFdEQV9UTElfTUlOX1JFU19EQVRBOwogICAgICB9CiAgICAgICBicmVhazsgLypvdXQgb2YgbWluIGRhdGEgcmVzb3VyY2VzKi8KICAgIH0KCiAgICBwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50Kys7CiAgICAvKiBNb3ZlIGRhdGEgYnVmZmVyIHVwIG9uZSBwYWNrZXQgKi8KICAgIHZvc19wa3Rfd2Fsa19wYWNrZXRfY2hhaW4oIHZvc0RhdGFCdWZmLCAmdm9zRGF0YUJ1ZmYsIDAvKmZhbHNlKi8gKTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUGFja2V0IGNoYWluIHN0YXJ0cyBhdCByb290ICsgMQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCB2b3NSb290LCAmdm9zRGF0YUJ1ZmYsIDEvKnRydWUqLyApOwoKICAqcHZvc0RhdGFCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgaWYgKHBiVXJnZW50KQogIHsKICAgICAgKnBiVXJnZW50ICAgICA9IHBUTENiLT5iVXJnZW50OwogIH0KICBlbHNlCiAgewogICAgICBWT1NfQVNTRVJUKCBwYlVyZ2VudCApOwogIH0KICByZXR1cm4gdWNSZXN1bHQ7Cn0vKiBXTEFOVExfR2V0RnJhbWVzICovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfVHhDb21wCgogIERFU0NSSVBUSU9OCiAgICBJdCBpcyBiZWluZyBjYWxsZWQgYnkgQkFMIHVwb24gYXN5bmNocm9ub3VzIG5vdGlmaWNhdGlvbiBvZiB0aGUgcGFja2V0CiAgICBvciBwYWNrZXRzICBiZWluZyBzZW50IG92ZXIgdGhlIGJ1cy4KCiAgREVQRU5ERU5DSUVTCiAgICBUeCBjb21wbGV0ZSBjYW5ub3QgYmUgY2FsbGVkIHdpdGhvdXQgYSBwcmV2aW91cyB0cmFuc21pdC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgQkFMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHZvc0RhdGFCdWZmOiAgIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ1ZmZlciBmb3Igd2hpY2gKICAgICAgICAgICAgICAgICAgICB0aGUgQkFMIHJlcG9ydCBpcyBiZWluZyBtYWRlLCBpZiB0aGVyZSBpcyBtb3JlIHRoZW4gb25lCiAgICAgICAgICAgICAgICAgICAgcGFja2V0IHRoZXkgd2lsbCBiZSBjaGFpbmVkIHVzaW5nIHZPU1MgYnVmZmVycy4KICAgIHdUeFN0YXR1czogICAgICB0aGUgc3RhdHVzIG9mIHRoZSB0cmFuc21pdHRlZCBwYWNrZXQsIHNlZSBhYm92ZSBjaGFwdGVyCiAgICAgICAgICAgICAgICAgICAgb24gSEREIGludGVyYWN0aW9uIGZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogIFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1R4Q29tcAooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCAgICAgICpwRnJhbWVEYXRhQnVmZiwKICBWT1NfU1RBVFVTICAgICAgd1R4U3RhdHVzCikKewogIHZvc19wa3RfdCogICAgICAgICAgIHZvc0RhdGFCdWZmID0gKHZvc19wa3RfdCopcEZyYW1lRGF0YUJ1ZmY7CiAgV0xBTlRMX0NiVHlwZSogICAgICAgcFRMQ2IgICAgID0gTlVMTDsKICBXTEFOVExfVHhDb21wQ0JUeXBlICBwZm5UeENvbXAgPSBOVUxMOwogIFZPU19TVEFUVVMgICAgICAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICB2b3NfcGt0X3QqICAgICAgICAgICB2b3NUZW1wVHggPSBOVUxMOwoKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSB2b3NEYXRhQnVmZiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpFeHRyYW5lb3VzIE5VTEwgZGF0YSBwb2ludGVyIG9uIFdMQU5UTF9UeENvbXAiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfVHhDb21wIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHdoaWxlICgoMCA8IHBUTENiLT51c1BlbmRpbmdUeENvbXBsZXRlQ291bnQpICYmCiAgICAgICAgICggVk9TX1NUQVRVU19TVUNDRVNTID09IHZvc1N0YXR1cyApICYmCiAgICAgICAgICggTlVMTCAhPSAgdm9zRGF0YUJ1ZmYpKQogIHsKICAgIHZvc19wa3RfZ2V0X3VzZXJfZGF0YV9wdHIoICB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSZwZm5UeENvbXApOwoKICAgIC8qaXQgc2hvdWxkIG5ldmVyIGJlIE5VTEwgLSBkZWZhdWx0IGhhbmRsZXIgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgaWYgbm9uZSovCiAgICBpZiAoIE5VTEwgPT0gcGZuVHhDb21wICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6TlVMTCBwb2ludGVyIHRvIFR4IENvbXBsZXRlIG9uIFdMQU5UTF9UeENvbXAiKSk7CiAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6Q2FsbGluZyBUeCBjb21wbGV0ZSBmb3IgcGt0ICVwIGluIGZ1bmN0aW9uICVwIiwKICAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsIHBmblR4Q29tcCkpOwoKICAgIHZvc1RlbXBUeCA9IHZvc0RhdGFCdWZmOwogICAgdm9zU3RhdHVzID0gdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggdm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9zRGF0YUJ1ZmYsIDEvKnRydWUqLyk7CgogICAgcGZuVHhDb21wKCBwdm9zR0N0eCwgdm9zVGVtcFR4LCB3VHhTdGF0dXMgKTsKCiAgICBwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50LS07CiAgfQoKIAogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICJXTEFOIFRMOiBjdXJyZW50IFRMIHZhbHVlcyBhcmU6IHJlc291cmNlcyA9ICVkICIKICAgICAgICAgICAgInBUTENiLT51c1BlbmRpbmdUeENvbXBsZXRlQ291bnQgPSAlZCIsCiAgICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCwgcFRMQ2ItPnVzUGVuZGluZ1R4Q29tcGxldGVDb3VudCkpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1R4Q29tcCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ2FjaGVTVEFGcmFtZQoKICBERVNDUklQVElPTgogICAgSW50ZXJuYWwgdXRpbGl0eSBmdW5jdGlvbiBmb3IgZm9yIGNhY2hpbmcgaW5jb21pbmcgZGF0YSBmcmFtZXMgdGhhdCBkbyAKICAgIG5vdCBoYXZlIGEgcmVnaXN0ZXJlZCBzdGF0aW9uIHlldC4gCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFpbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuCiAgICBJbiBvcmRlciB0byBiZW5lZml0IGZyb20gdGhzaSBjYWNoaW5nLCB0aGUgY29tcG9uZW50cyBtdXN0IGVuc3VyZSB0aGF0CiAgICB0aGV5IHdpbGwgb25seSByZWdpc3RlciB3aXRoIFRMIGF0IHRoZSBtb21lbnQgd2hlbiB0aGV5IGFyZSBmdWxseSBzZXR1cAogICAgYW5kIHJlYWR5IHRvIHJlY2VpdmUgaW5jb21pbmcgZGF0YSAKICAgCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICAKICAgIHBUTENiOiAgICAgICAgICAgICAgICAgIFRMIGNvbnRyb2wgYmxvY2sKICAgIHVjU1RBSWQ6ICAgICAgICAgICAgICAgIHN0YXRpb24gaWQKICAgIHZvc1RlbXBCdWZmOiAgICAgICAgICAgIHRoZSBkYXRhIHBhY2tldAogICAgdURQVVNpZzogICAgICAgICAgICAgICAgRFBVIHNpZ25hdHVyZSBvZiB0aGUgaW5jb21pbmcgcGFja2V0CiAgICBiQmNhc3Q6ICAgICAgICAgICAgICAgICB0cnVlIGlmIHBhY2tldCBoYWQgdGhlIE1DL0JDIGJpdCBzZXQgCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIG9yIFNUQSBJZCBpbnZhbGlkIDsgYWNjZXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnN0YXRpYyBWT1NfU1RBVFVTCldMQU5UTF9DYWNoZVNUQUZyYW1lCigKICBXTEFOVExfQ2JUeXBlKiAgICBwVExDYiwKICB2X1U4X3QgICAgICAgICAgICB1Y1NUQUlkLAogIHZvc19wa3RfdCogICAgICAgIHZvc1RlbXBCdWZmLAogIHZfVTMyX3QgICAgICAgICAgIHVEUFVTaWcsCiAgdl9VOF90ICAgICAgICAgICAgYkJjYXN0LAogIHZfVThfdCAgICAgICAgICAgIHVjRnJtVHlwZQopCnsKICB2X1U4X3QgICAgdWNVY2FzdFNpZzsKICB2X1U4X3QgICAgdWNCY2FzdFNpZzsKICB2X0JPT0xfdCAgYk9sZFNUQVBrdDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKICAgICBTYW5pdHkgY2hlY2sgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgKCBOVUxMID09IHZvc1RlbXBCdWZmICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6IEludmFsaWQgaW5wdXQgcG9pbnRlciBvbiBXTEFOVExfQ2FjaGVTVEFGcmFtZSBUTCAlcCIKICAgICAgICAgICAgICAgIiBQYWNrZXQgJXAiLCBwVExDYiwgdm9zVGVtcEJ1ZmYgKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9DYWNoZVNUQUZyYW1lIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkF0dGVtcHRpbmcgdG8gY2FjaGUgcGt0IGZvciBTVEEgJWQsIEJEIERQVSBTaWc6ICVkIHdpdGggc2lnIFVDOiAlZCwgQkM6ICVkIiwgCiAgICAgICAgICAgICB1Y1NUQUlkLCB1RFBVU2lnLAogICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZywKICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcpKTsKCiAgaWYoV0xBTlRMX0lTX0NUUkxfRlJBTUUodWNGcm1UeXBlKSkKICB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6IE5vIG5lZWQgdG8gY2FjaGUgQ1RSTCBmcmFtZS4gRHJvcHBpbmciKSk7CiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7IAogICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiB0aGUgcGFja2V0IHRoYXQgd2UgYXJlIHRyeWluZyB0byBjYWNoZSBiZWxvbmdzIHRvIHRoZSBvbGQKICAgIHJlZ2lzdGVyZWQgc3RhdGlvbiAoaWYgYW55KSBvciB0aGUgbmV3IChwb3RlbnRpYWxseSl1cGNvbWluZyBzdGF0aW9uCiAgICAKICAgIC0gSWYgdGhlIFNUQSB3aXRoIHRoaXMgSWQgd2FzIG5ldmVyIHJlZ2lzdGVyZWQgd2l0aCBUTCAtIHRoZSBzaWduYXR1cmUKICAgIHdpbGwgYmUgaW52YWxpZDsKICAgIC0gSWYgdGhlIFNUQSB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkIFRMIHdpbGwgaGF2ZSBjYWNoZWQgdGhlIGZvcm1lcgogICAgc2V0IG9mIERQVSBzaWduYXR1cmVzCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBiQmNhc3QgKQogIHsKICAgIHVjQmNhc3RTaWcgPSAodl9VOF90KXVEUFVTaWc7CiAgICBiT2xkU1RBUGt0ID0gKCggV0xBTl9UTF9JTlZBTElEX0JfU0lHICE9IAogICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnICkgJiYKICAgICAgKCB1Y0JjYXN0U2lnID09IHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcgKSk7CiAgfQogIGVsc2UKICB7CiAgICB1Y1VjYXN0U2lnID0gKHZfVThfdCl1RFBVU2lnOwogICAgYk9sZFNUQVBrdCA9ICgoIFdMQU5fVExfSU5WQUxJRF9VX1NJRyAhPSAKICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnICkgJiYKICAgICAgICAoIHVjVWNhc3RTaWcgPT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZyApKTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJZiB0aGUgdmFsdWUgb2YgdGhlIERQVSBTSUcgbWF0Y2hlcyB0aGUgb2xkLCB0aGlzIHBhY2tldCB3aWxsIG5vdAogICAgYmUgY2FjaGVkIGFzIGl0IGJlbG9uZ2VkIHRvIHRoZSBmb3JtZXIgYXNzb2NpYXRpb24KICAgIEluIGNhc2UgdGhlIFNJRyBkb2VzIG5vdCBtYXRjaCAtIHRoaXMgaXMgYSBwYWNrZXQgZm9yIGEgcG90ZW50aWFsbHkgbmV3CiAgICBhc3NvY2lhdGVkIHN0YXRpb24gCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBiT2xkU1RBUGt0IHx8IGJCY2FzdCApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6RGF0YSBwYWNrZXQgbWF0Y2hlcyBvbGQgc2lnIGZvciBzaWcgRFBVOiAlZCBVQzogJWQsICIKICAgICAgICAgICAgICAgIkJDOiAlZCAtIGRyb3BwaW5nIiwgCiAgICAgICAgICAgICAgIHVEUFVTaWcsIAogICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnLAogICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnKSk7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOyAKICB9CiAgZWxzZQogIHsKICAgIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBLT52b3NCZWdDYWNoZWRGcmFtZSApCiAgICB7CiAgICAgIC8qdGhpcyBpcyB0aGUgZmlyc3QgZnJhbWUgdGhhdCB3ZSBhcmUgY2FjaGluZyAqLwogICAgICBwQ2xpZW50U1RBLT52b3NCZWdDYWNoZWRGcmFtZSA9IHZvc1RlbXBCdWZmOwoKICAgICAgcENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVJbml0VGltZSA9IHZvc190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKTsKICAgICAgcENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVEb25lVGltZSA9CiAgICAgICAgICAgICAgcENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVJbml0VGltZTsKICAgICAgcENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVTaXplID0gMTsKCiAgICAgIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwgVFJBQ0VfQ09ERV9UTF9DQUNIRV9GUkFNRSwKICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZVNpemUpKTsKCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIC8qdGhpcyBpcyBhIHN1YnNlcXVlbnQgZnJhbWUgdGhhdCB3ZSBhcmUgY2FjaGluZzogY2hhaW4gdG8gdGhlIGVuZCAqLwogICAgICB2b3NfcGt0X2NoYWluX3BhY2tldChwQ2xpZW50U1RBLT52b3NFbmRDYWNoZWRGcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYsIFZPU19UUlVFKTsKCiAgICAgIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlRG9uZVRpbWUgPSB2b3NfdGltZXJfZ2V0X3N5c3RlbV90aW1lKCk7CiAgICAgIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlU2l6ZSArKzsKCiAgICAgIGlmIChwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZVNpemUgJSBXTEFOVExfQ0FDSEVfVFJBQ0VfV0FURVJNQVJLID09IDApCiAgICAgIHsKICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiJXM6IENhY2hlIEhpZ2ggd2F0ZXJtYXJrIGZvciBzdGFpZDolZCAoJWQpIiwKICAgICAgICAgICAgICAgICAgX19mdW5jX18sdWNTVEFJZCwgcENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVTaXplKTsKICAgICAgICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsIFRSQUNFX0NPREVfVExfQ0FDSEVfRlJBTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZVNpemUpKTsKICAgICAgfQogICAgfQogICAgcENsaWVudFNUQS0+dm9zRW5kQ2FjaGVkRnJhbWUgPSB2b3NUZW1wQnVmZjsKICB9LyplbHNlIG5ldyBwYWNrZXQqLwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOyAKfS8qV0xBTlRMX0NhY2hlU1RBRnJhbWUqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfRmx1c2hDYWNoZWRGcmFtZXMKCiAgREVTQ1JJUFRJT04KICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSBUTCB0byBmbHVzaCB0aGUgc3RhdGlvbiBjYWNoZQoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgogICAgCiAgUEFSQU1FVEVSUwoKICAgIElOCgogICAgdm9zRGF0YUJ1ZmY6ICAgaXQgd2lsbCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2FjaGVkIGJ1ZmZlcgogICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQsCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKICBOT1RFCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmUtaW5pdGlhbGl6ZSB2b3NEYXRhQnVmZiB0byBOVUxMLiBJdCdzIGNhbGxlcidzIAogICAgcmVzcG9uc2liaWxpdHkgdG8gZG8gc28sIGlmIHJlcXVpcmVkLCBhZnRlciB0aGlzIGZ1bmN0aW9uIGNhbGwuCiAgICBCZWNhdXNlIG9mIHRoaXMgcmVzdHJpY3Rpb24sIHdlIGRlY2lkZSB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdG8gc3RhdGljCiAgICBzbyB0aGF0IHVwcGVyIGxheWVyIGRvZXNuJ3QgbmVlZCB0byBiZSBhd2FyZSBvZiB0aGlzIHJlc3RyaWN0aW9uLiAKICAgIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kc3RhdGljIFZPU19TVEFUVVMKV0xBTlRMX0ZsdXNoQ2FjaGVkRnJhbWVzCigKICB2b3NfcGt0X3QqICAgICAgdm9zRGF0YUJ1ZmYKKQp7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZXR1cm4gdGhlIGVudGlyZSBjaGFpbiB0byB2b3MgaWYgdGhlcmUgYXJlIGluZGVlZCBjYWNoZSBmcmFtZXMgCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMICE9IHZvc0RhdGFCdWZmICkKICB7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsgIAp9LypXTEFOVExfRmx1c2hDYWNoZWRGcmFtZXMqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfRm9yd2FyZFNUQUZyYW1lcwoKICBERVNDUklQVElPTgogICAgSW50ZXJuYWwgdXRpbGl0eSBmdW5jdGlvbiBmb3IgZWl0aGVyIGZvcndhcmRpbmcgY2FjaGVkIGRhdGEgdG8gdGhlIHN0YXRpb24gYWZ0ZXIKICAgIHRoZSBzdGF0aW9uIGhhcyBiZWVuIHJlZ2lzdGVyZWQsIG9yIGZsdXNoaW5nIGNhY2hlZCBkYXRhIGlmIHRoZSBzdGF0aW9uIGhhcyBub3QgCiAgICBiZWVuIHJlZ2lzdGVyZWQuIAogICAgIAoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgogICAKICBQQVJBTUVURVJTCgogICAgSU4KICAgIAogICAgcFRMQ2I6ICAgICAgICAgICAgICAgICAgVEwgY29udHJvbCBibG9jawogICAgdWNTVEFJZDogICAgICAgICAgICAgICAgc3RhdGlvbiBpZAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKICAgIFRoaXMgZnVuY3Rpb24gZG9lc24ndCByZS1pbml0aWFsaXplIHZvc0RhdGFCdWZmIHRvIE5VTEwuIEl0J3MgY2FsbGVyJ3MgCiAgICByZXNwb25zaWJpbGl0eSB0byBkbyBzbywgaWYgcmVxdWlyZWQsIGFmdGVyIHRoaXMgZnVuY3Rpb24gY2FsbC4KICAgIEJlY2F1c2Ugb2YgdGhpcyByZXN0cmljdGlvbiwgd2UgZGVjaWRlIHRvIG1ha2UgdGhpcyBmdW5jdGlvbiB0byBzdGF0aWMKICAgIHNvIHRoYXQgdXBwZXIgbGF5ZXIgZG9lc24ndCBuZWVkIHRvIGJlIGF3YXJlIG9mIHRoaXMgcmVzdHJpY3Rpb24uIAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnN0YXRpYyBWT1NfU1RBVFVTCldMQU5UTF9Gb3J3YXJkU1RBRnJhbWVzCigKICB2b2lkKiAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICB1Y1NUQUlkLAogIHZfVThfdCAgICAgICAgICAgIHVjVWNhc3RTaWcsCiAgdl9VOF90ICAgICAgICAgICAgdWNCY2FzdFNpZwopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCiAgICAgU2FuaXR5IGNoZWNrIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDogSW52YWxpZCBpbnB1dCBwb2ludGVyIG9uIFdMQU5UTF9Gb3J3YXJkU1RBRnJhbWVzIFRMICVwIiwKICAgICAgICAgcFRMQ2IgKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9Gb3J3YXJkU1RBRnJhbWVzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8vV0xBTl9UTF9MT0NLX1NUQV9DQUNIRShwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSk7IAoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIENoZWNrIGlmIHN0YXRpb24gaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQgaW4gdGhlIG1lYW4gd2hpbGUKICAgICBpZiBub3QgcmVnaXN0ZXJlZCwgZmx1c2ggY2FjaGVkIGZyYW1lcy4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgIldMQU4gVEw6U3RhdGlvbiBoYXMgYmVlbiBkZWxldGVkIGZvciBTVEEgJWQgLSBmbHVzaGluZyBjYWNoZSIsIHVjU1RBSWQpKTsKICAgIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwgVFJBQ0VfQ09ERV9UTF9GTFVTSF9DQUNIRURfRlJBTUVTLAogICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZVNpemUpKTsKICAgIFdMQU5UTF9GbHVzaENhY2hlZEZyYW1lcyhwQ2xpZW50U1RBLT52b3NCZWdDYWNoZWRGcmFtZSk7CiAgICBnb3RvIGRvbmU7IAogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZvcndhcmRpbmcgY2FjaGUgZnJhbWVzIHJlY2VpdmVkIHdoaWxlIHRoZSBzdGF0aW9uIHdhcyBpbiB0aGUgcHJvY2VzcyAgIAogICAgb2YgYmVpbmcgcmVnaXN0ZXJlZCB3aXRoIHRoZSByZXN0IG9mIHRoZSBTVyBjb21wb25lbnRzICAgCgogICAgQWNjZXNzIHRvIHRoZSBjYWNoZSBtdXN0IGJlIGxvY2tlZDsgc2ltaWxhcmx5IHVwZGF0aW5nIHRoZSBzaWduYXR1cmUgYW5kICAgCiAgICB0aGUgZXhpc3RlbmNlIGZsYWcgbXVzdCBiZSBzeW5jaHJvbml6ZWQgYmVjYXVzZSB0aGVzZSB2YWx1ZXMgYXJlIGNoZWNrZWQgICAKICAgIGR1cmluZyBjYWNoZWQgIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICJXTEFOIFRMOlByZXBhcmluZyB0byBmd2QgcGFja2V0cyBmb3IgU1RBICVkIiwgdWNTVEFJZCkpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYXZlIHRoZSBuZXcgc2lnbmF0dXJlIHZhbHVlcwogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZyAgPSB1Y1VjYXN0U2lnOwogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcgID0gdWNCY2FzdFNpZzsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICJXTEFOIFRMOkZ3ZC1pbmcgcGFja2V0cyBmb3IgU1RBICVkIFVDICVkIEJDICVkIiwKICAgICAgIHVjU1RBSWQsIHVjVWNhc3RTaWcsIHVjQmNhc3RTaWcpKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKICAgICBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgY2FjaGVkIGRhdGEgdG8gZm9yd2FyZCAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAogIGlmICggTlVMTCAhPSBwQ2xpZW50U1RBLT52b3NCZWdDYWNoZWRGcmFtZSApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6IEZ3ZC1pbmcgQ2FjaGVkIHBhY2tldHMgZm9yIHN0YXRpb24gJWQiLCB1Y1NUQUlkICkpOwoKICAgIFdMQU5UTF9SeENhY2hlZEZyYW1lcyggcFRMQ2IsIAogICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dm9zQmVnQ2FjaGVkRnJhbWUpOwogIH0KICBlbHNlCiAgewogICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBOTyBjYWNoZWQgcGFja2V0cyBmb3Igc3RhdGlvbiAlZCIsIHVjU1RBSWQgKSk7CiAgfQoKZG9uZToKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAogICBDbGVhciB0aGUgc3RhdGlvbiBjYWNoZSAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcENsaWVudFNUQS0+dm9zQmVnQ2FjaGVkRnJhbWUgPSBOVUxMOwogIHBDbGllbnRTVEEtPnZvc0VuZENhY2hlZEZyYW1lID0gTlVMTDsKICBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZVNpemUgPSAwOwogIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlQ2xlYXJUaW1lID0gdm9zX3RpbWVyX2dldF9zeXN0ZW1fdGltZSgpOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFmdGVyIGFsbCB0aGUgaW5pdCBpcyBjb21wbGV0ZSB3ZSBjYW4gbWFyayB0aGUgZXhpc3RhbmNlIGZsYWcgCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwQ2xpZW50U1RBLT5lbmFibGVDYWNoaW5nID0gMDsKCiAgLy9XTEFOX1RMX1VOTE9DS19TVEFfQ0FDSEUocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0pOyAKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOyAKCn0vKldMQU5UTF9Gb3J3YXJkU1RBRnJhbWVzKi8KCgojaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9Jc0lBUFBGcmFtZQoKICBERVNDUklQVElPTgogICAgSW50ZXJuYWwgdXRpbGl0eSBmdW5jdGlvbiBmb3IgZGV0ZWN0aW5nIGluY29taW5nIEVTRSBJQVBQIGZyYW1lcwoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICAKICAgIHB2QkRIZWFkZXI6ICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIEJEIGhlYWRlcgogICAgdm9zVGVtcEJ1ZmY6ICAgICAgICAgICAgdGhlIGRhdGEgcGFja2V0CgogICAgSU4vT1VUCiAgICBwRmlyc3REYXRhUGt0QXJyaXZlZDogICBzdGF0aWMgZnJvbSBjYWxsZXIgZnVuY3Rpb247IHVzZWQgZm9yIHJzc2kgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRhdGlvbgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfVFJVRTogICBJdCBpcyBhIElBUFAgZnJhbWUKICAgIFZPU19GQUxTRTogIEl0IGlzIE5PVCBJQVBQIGZyYW1lCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZfQk9PTF90CldMQU5UTF9Jc0lBUFBGcmFtZQooCiAgdl9QVk9JRF90ICAgICAgICAgcHZCREhlYWRlciwKICB2b3NfcGt0X3QqICAgICAgICB2b3NUZW1wQnVmZgopCnsKICB2X1UxNl90ICAgICAgICAgICAgIHVzTVBEVURPZmZzZXQ7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y09mZnNldDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjU25hcEhkcltXTEFOVExfTExDX1NOQVBfU0laRV07CiAgdl9TSVpFX3QgICAgICAgICAgICB1c1NuYXBIZHJTaXplID0gV0xBTlRMX0xMQ19TTkFQX1NJWkU7CiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CgogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgT1VJIGZpZWxkIGlzIHByZXNlbnQuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBWT1NfRkFMU0UgPT0gV0RBX0lTX1JYX0xMQ19QUkVTRU5UKHB2QkRIZWFkZXIpICkKICB7CiAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDpMTEMgaGVhZGVyIHJlbW92ZWQsIGNhbm5vdCBkZXRlcm1pbmUgQlQtQU1QIHR5cGUgLSIKICAgICAgICAgICAgICAgICAgImRyb3BwaW5nIHBrdCIpKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgcmV0dXJuIFZPU19UUlVFOwogIH0KICB1c01QRFVET2Zmc2V0ID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfREFUQV9PRkZTRVQocHZCREhlYWRlcik7CiAgdWNPZmZzZXQgICAgICA9ICh2X1U4X3QpdXNNUERVRE9mZnNldCArIFdMQU5UTF9MTENfU05BUF9PRkZTRVQ7CgogIHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NUZW1wQnVmZiwgdWNPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCl1Y1NuYXBIZHIsICZ1c1NuYXBIZHJTaXplKTsKCiAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykpIAogIHsKICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgIlVuYWJsZSB0byBleHRyYWN0IFNuYXAgSGRyIG9mIGRhdGEgIHBhY2tldCAtIgogICAgICAgICAgICAgICAgImRyb3BwaW5nIHBrdCIpKTsKICAgIHJldHVybiBWT1NfRkFMU0U7CiAgfQoKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiB0aGlzIGlzIElBUFAgZnJhbWUgYnkgbWF0Y2hpbmcgQWlyb25ldCBTbmFwIGhkci4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAvLyBDb21wYXJlIHJldHVybnMgMSBpZiB2YWx1ZXMgYXJlIHNhbWUgYW5kIDAKICAvLyBpZiBub3QgdGhlIHNhbWUuCiAgaWYgKCggV0xBTlRMX0xMQ19TTkFQX1NJWkUgIT0gdXNTbmFwSGRyU2l6ZSApIHx8CiAgICAgKCAwID09IHZvc19tZW1fY29tcGFyZSh1Y1NuYXBIZHIsICh2X1BWT0lEX3QpV0xBTlRMX0FJUk9ORVRfU05BUF9IRUFERVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTExDX1NOQVBfU0laRSApICkpCiAgewogICAgcmV0dXJuIFZPU19GQUxTRTsKICB9CgogIHJldHVybiBWT1NfVFJVRTsKCn0KI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0VTRQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfUHJvY2Vzc0JBUEZyYW1lCgogIERFU0NSSVBUSU9OCiAgICBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIGluY29taW5nIEJULUFNUCBmcmFtZXMKCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIEJvdGhlIHRoZSBCVC1BTVAgc3RhdGlvbiBhbmQgdGhlIEJBUCBDdHJsIHBhdGggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSAKICAgIHJlZ2lzdGVyZWQgd2l0aCBUTC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICAKICAgIHB2QkRIZWFkZXI6ICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIEJEIGhlYWRlcgogICAgdm9zVGVtcEJ1ZmY6ICAgICAgICAgICAgdGhlIGRhdGEgcGFja2V0CiAgICBwVExDYjogICAgICAgICAgICAgICAgICBUTCBjb250cm9sIGJsb2NrCiAgICB1Y1NUQUlkOiAgICAgICAgICAgICAgICBzdGF0aW9uIGlkCgogICAgSU4vT1VUCiAgICBwRmlyc3REYXRhUGt0QXJyaXZlZDogICBzdGF0aWMgZnJvbSBjYWxsZXIgZnVuY3Rpb247IHVzZWQgZm9yIHJzc2kgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRhdGlvbgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2X0JPT0xfdApXTEFOVExfUHJvY2Vzc0JBUEZyYW1lCigKICB2X1BWT0lEX3QgICAgICAgICBwdkJESGVhZGVyLAogIHZvc19wa3RfdCogICAgICAgIHZvc1RlbXBCdWZmLAogIFdMQU5UTF9DYlR5cGUqICAgIHBUTENiLAogIHZfVThfdCogICAgICAgICAgIHBGaXJzdERhdGFQa3RBcnJpdmVkLAogIHZfVThfdCAgICAgICAgICAgIHVjU1RBSWQKKQp7CiAgdl9VMTZfdCAgICAgICAgICAgICB1c01QRFVET2Zmc2V0OwogIHZfVThfdCAgICAgICAgICAgICAgdWNPZmZzZXQ7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y09VSVtXTEFOVExfTExDX09VSV9TSVpFXTsKICB2X1NJWkVfdCAgICAgICAgICAgIHVzT1VJU2l6ZSA9IFdMQU5UTF9MTENfT1VJX1NJWkU7CiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CiAgdl9VMTZfdCAgICAgICAgICAgICB1c1R5cGU7CiAgdl9TSVpFX3QgICAgICAgICAgICB1c1R5cGVMZW4gPSBzaXplb2YodXNUeXBlKTsKICB2X1U4X3QgICAgICAgICAgICAgIHVjTVBEVUhPZmZzZXQ7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y01QRFVITGVuID0gMDsKICB2X1UxNl90ICAgICAgICAgICAgIHVzQWN0dWFsSExlbiA9IDA7CgogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBPVUkgYW5kIHR5cGUgZnJvbSBMTEMgYW5kIHZhbGlkYXRlOyBpZiBub24tZGF0YSBzZW5kIHRvIEJBUAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggVk9TX0ZBTFNFID09IFdEQV9JU19SWF9MTENfUFJFU0VOVChwdkJESGVhZGVyKSApCiAgewogICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAiV0xBTiBUTDpMTEMgaGVhZGVyIHJlbW92ZWQsIGNhbm5vdCBkZXRlcm1pbmUgQlQtQU1QIHR5cGUgLSIKICAgICAgICAgICAgICAiZHJvcHBpbmcgcGt0IikpOwogICAgLyogRHJvcCBwYWNrZXQgKi8KICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICByZXR1cm4gVk9TX1RSVUU7IAogIH0KCiAgdXNNUERVRE9mZnNldCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0RBVEFfT0ZGU0VUKHB2QkRIZWFkZXIpOwogIHVjTVBEVUhPZmZzZXQgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfT0ZGU0VUKHB2QkRIZWFkZXIpOwogIHVjTVBEVUhMZW4gICAgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfTEVOKHB2QkRIZWFkZXIpOwogIHVjT2Zmc2V0ICAgICAgPSAodl9VOF90KXVzTVBEVURPZmZzZXQgKyBXTEFOVExfTExDX09VSV9PRkZTRVQ7CgogIHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NUZW1wQnVmZiwgdWNPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCl1Y09VSSwgJnVzT1VJU2l6ZSk7CgojaWYgMAogIC8vIENvbXBhcmUgcmV0dXJucyAxIGlmIHZhbHVlcyBhcmUgc2FtZSBhbmQgMAogIC8vIGlmIG5vdCB0aGUgc2FtZS4KICBpZiAoKCBXTEFOVExfTExDX09VSV9TSVpFICE9IHVzT1VJU2l6ZSApIHx8CiAgICAgKCAwID09IHZvc19tZW1fY29tcGFyZSh1Y09VSSwgKHZfUFZPSURfdClXTEFOVExfQlRfQU1QX09VSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9MTENfT1VJX1NJWkUgKSApKQogIHsKICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgIkxMQyBoZWFkZXIgcG9pbnRzIHRvIGRpZmYgT1VJIGluIEJULUFNUCBzdGF0aW9uIC0iCiAgICAgICAgICAgICAgICAiZHJvcHBpbmcgcGt0IikpOwogICAgLyogRHJvcCBwYWNrZXQgKi8KICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICByZXR1cm4gVk9TX1RSVUU7CiAgfQojZW5kaWYKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBMTEMgT1VJIGFuZCBlbnN1cmUgdGhhdCB0aGlzIGlzIGluZGVlZCBhIEJULUFNUCBmcmFtZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NUZW1wQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNPZmZzZXQgKyBXTEFOVExfTExDX09VSV9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnVzVHlwZSwgJnVzVHlwZUxlbik7CgogIGlmICgoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpIHx8CiAgICAgICggc2l6ZW9mKHVzVHlwZSkgIT0gdXNUeXBlTGVuICkpCiAgewogICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGV4dHJhY3QgdHlwZSBvbiBpbmNvbWluZyBCQVAgcGFja2V0IC0iCiAgICAgICAgICAgICAgICAiZHJvcHBpbmcgcGt0IikpOwogICAgLyogRHJvcCBwYWNrZXQgKi8KICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICByZXR1cm4gVk9TX1RSVUU7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgdGhpcyBpcyBCVC1BTVAgZGF0YSBvciBjdHJsIHBhY2tldChSU04sIExpbmtTdmlzaW9uLCBBY3Rpdml0eVIpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdXNUeXBlID0gdm9zX2JlMTZfdG9fY3B1KHVzVHlwZSk7CgogIGlmIChXTEFOVExfQkFQX0lTX05PTl9EQVRBX1BLVF9UWVBFKHVzVHlwZSkpCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgIldMQU4gVEw6Tm9uLWRhdGEgcGFja2V0IHJlY2VpdmVkIG92ZXIgQlQtQU1QIGxpbms6ICVkLCA9PiBCQVAiLAogICAgICAgICAgICAgICB1c1R5cGUpKTsKCiAgICAvKkZsYXR0ZW4gcGFja2V0IGFzIEJBUCBleHBlY3RzIHRvIGJlIGFibGUgdG8gcGVlayovCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NfcGt0X2ZsYXR0ZW5fcnhfcGt0KCZ2b3NUZW1wQnVmZikpCiAgICB7CiAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBmbGF0dGVuIEJULUFNUCBwYWNrZXQgLSBkcm9wcGluZyIpKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgcmV0dXJuIFZPU19UUlVFOwogICAgfQoKICAgIC8qIFNlbmQgcGFja2V0IHRvIEJBUCBjbGllbnQqLwogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0RBX0RTX1RyaW1SeFBhY2tldEluZm8oIHZvc1RlbXBCdWZmICkgKQogICAgewogICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAiV0xBTiBUTDpCRCBoZWFkZXIgY29ycnVwdGVkIC0gZHJvcHBpbmcgcGFja2V0IikpOwogICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICByZXR1cm4gVk9TX1RSVUU7CiAgICB9CgogICAgaWYgKCAwID09IFdEQV9HRVRfUlhfRlRfRE9ORShwdkJESGVhZGVyKSApCiAgICB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAiTm9uLWRhdGEgcGFja2V0IHJlY2VpdmVkIG92ZXIgQlQtQU1QIGxpbms6IFNlbmRpbmcgaXQgZm9yICIKICAgICAgICAgICJmcmFtZSBUcmFuc2xhdGlvbiIpKTsKCiAgICAgIGlmICh1c01QRFVET2Zmc2V0ID4gdWNNUERVSE9mZnNldCkKICAgICAgewogICAgICAgIHVzQWN0dWFsSExlbiA9IHVzTVBEVURPZmZzZXQgLSB1Y01QRFVIT2Zmc2V0OwogICAgICB9CgogICAgICAvKiBzb2Z0d2FyZSBmcmFtZSB0cmFuc2xhdGlvbiBmb3IgQlRBTVAgV0RTLiovCiAgICAgIFdMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlciggdm9zVGVtcEJ1ZmYsICZ2b3NTdGF0dXMsIHVzQWN0dWFsSExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCBwVExDYix1Y1NUQUlkLCBWT1NfRkFMU0UpOwogICAgICAKICAgIH0KICAgIGlmIChwVExDYi0+dGxCQVBDbGllbnQucGZuVGxCQVBSeCkKICAgICAgICBwVExDYi0+dGxCQVBDbGllbnQucGZuVGxCQVBSeCggdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1RMLHBUTENiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOVExfQkFQRnJhbWVFbnVtVHlwZSl1c1R5cGUgKTsKICAgIGVsc2UKICAgIHsKICAgICAgICBWT1NfQVNTRVJUKDApOwogICAgfQoKICAgIHJldHVybiBWT1NfVFJVRTsKICB9CiAgZWxzZQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICJXTEFOIFRMOiBCQVAgREFUQSBwYWNrZXQgcmVjZWl2ZWQgb3ZlciBCVC1BTVAgbGluazogJWQsID0+IEJBUCIsCiAgICAgICAgICAgICAgIHVzVHlwZSkpOwogICAvKiEhIUZJWCBNRSEhKi8KICNpZiAwCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgRm9yIGRhdGEgcGFja2V0IGNvbGxlY3QgcGh5IHN0YXRzIFJTU0kgYW5kIExpbmsgUXVhbGl0eQogICAgIENhbGN1bGF0ZSB0aGUgUlNTSSBhdmVyYWdlIGFuZCBzYXZlIGl0LiBDb250aW51b3VzIGF2ZXJhZ2UgaXMgZG9uZS4KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmICggKnBGaXJzdERhdGFQa3RBcnJpdmVkID09IDApCiAgICB7CiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnJzc2lBdmcgPQogICAgICAgICBXTEFOSEFMX0dFVF9SU1NJX0FWRVJBR0UoIHB2QkRIZWFkZXIgKTsKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUxpbmtRdWFsaXR5QXZnID0gCiAgICAgICAgV0xBTkhBTF9SWF9CRF9HRVRfU05SKCBwdkJESGVhZGVyICk7CgogICAgICAvLyBSY3ZkIDFzdCBwa3QsIHN0YXJ0IGF2ZXJhZ2UgZnJvbSBuZXh0IHRpbWUKICAgICAgKnBGaXJzdERhdGFQa3RBcnJpdmVkID0gMTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ucnNzaUF2ZyA9CiAgICAgICAgICAoV0xBTkhBTF9HRVRfUlNTSV9BVkVSQUdFKCBwdkJESGVhZGVyICkgKyAKICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5yc3NpQXZnKS8yOwogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51TGlua1F1YWxpdHlBdmcgPQogICAgICAgICAgKFdMQU5IQUxfUlhfQkRfR0VUX1NOUiggcHZCREhlYWRlciApICsgIAogICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVMaW5rUXVhbGl0eUF2ZykvMjsKICAgIH0vKkVsc2UsIGZpcnN0IGRhdGEgcGFja2V0Ki8KICNlbmRpZgogIH0vKkJULUFNUCBkYXRhIHBhY2tldCovCgogIHJldHVybiBWT1NfRkFMU0U7IAp9LypXTEFOVExfUHJvY2Vzc0JBUEZyYW1lKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9Qcm9jZXNzRkNGcmFtZQoKICBERVNDUklQVElPTgogICAgSW50ZXJuYWwgdXRpbGl0eSBmdW5jdGlvbiBmb3IgcHJvY2Vzc2luZyBpbmNvbWluZyBGbG93IENvbnRyb2wgZnJhbWVzLiBFbmFibGUKICAgIG9yIGRpc2FibGUgTFdNIG1vZGUgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uLgoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgogICAgRlcgc2VuZHMgdXAgc3BlY2lhbCBmbG93IGNvbnRyb2wgZnJhbWUuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHggICAgICAgICAgICAgICAgcG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQKICAgIHB2QkRIZWFkZXI6ICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIEJEIGhlYWRlcgogICAgcFRMQ2I6ICAgICAgICAgICAgICAgICAgVEwgY29udHJvbCBibG9jawogICAgcHZCREhlYWRlciAgICAgICAgICAgICAgcG9pbnRlciB0byBCRCBoZWFkZXIuCgogICAgSU4vT1VUCiAgICBwRmlyc3REYXRhUGt0QXJyaXZlZDogICBzdGF0aWMgZnJvbSBjYWxsZXIgZnVuY3Rpb247IHVzZWQgZm9yIHJzc2kgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRhdGlvbgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgZnJhbWUgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCiAgICBUaGUgaW5ncmVzcyBhbmQgZWdyZXNzIG9mIGVhY2ggc3RhdGlvbiB3aWxsIGJlIHVwZGF0ZWQuIElmIG5lZWRlZCwgTFdNIG1vZGUgd2lsbAogICAgYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBiYXNlZCBvbiB0aGUgZmxvdyBjb250cm9sIGFsZ29yaXRobS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2X0JPT0xfdApXTEFOVExfUHJvY2Vzc0ZDRnJhbWUKKAogIHZfUFZPSURfdCAgICAgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCogICAgICAgIHB2b3NEYXRhQnVmZiwKICB2X1BWT0lEX3QgICAgICAgICBwdkJESGVhZGVyCikKewojaWYgMSAvL2VuYWJsZSBwcm9jZXNzaW5nIG9mIG9ubHkgZmNTdGFUeERpc2FibGVkIGJpdG1hcCBmb3Igbm93LiB0aGUgZWxzZSBwYXJ0IGlzIG9sZCBiZXR0ZXIgcW9zIGNvZGUuCiAgICAgIC8vIG5lZWQgdG8gcmV2aXNpdCB0aGUgb2xkIGNvZGUgZm9yIGZ1bGwgaW1wbGVtZW50YXRpb24uCiAgdl9VOF90ICAgICAgICAgICAgdWNTVEFJZDsKICB2X1UxNl90ICAgICAgICAgICB1Y1N0YVZhbGlkQml0bWFwOwogIHZfVTE2X3QgICAgICAgICAgIHVjU3RhVHhEaXNhYmxlZEJpdG1hcDsKICBXTEFOVExfQ2JUeXBlKiAgICBwVExDYiA9IE5VTEw7CiAgI2lmZGVmIFRMX0RFQlVHX0ZDCiAgdl9VMzJfdCAgICAgICAgICAgcnhUaW1lU3RhbXA7CiAgdl9VMzJfdCAgICAgICAgICAgY3VyVGljazsKICAjZW5kaWYKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU3VzcGVuZERhdGFUeCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHVjU3RhVmFsaWRCaXRtYXAgPSBXREFfR0VUX1JYX0ZDX1ZBTElEX1NUQV9NQVNLKHB2QkRIZWFkZXIpOwogIHVjU3RhVHhEaXNhYmxlZEJpdG1hcCA9IFdEQV9HRVRfUlhfRkNfU1RBX1RYX0RJU0FCTEVEX0JJVE1BUChwdkJESGVhZGVyKTsKI2lmZGVmIFRMX0RFQlVHX0ZDCiAgcnhUaW1lU3RhbXAgPSBXREFfR0VUX1JYX1RJTUVTVEFNUChwdkJESGVhZGVyKTsKICAvKiBoYXJkIGNvZGUgb2YgTVRVX0dMT0JBTF9USU1FUl9BRERSIHRvIGNhbGN1bGF0ZSB0aGUgdGltZSBiZXR3ZWVuIGdlbmVyYXRlZCBhbmQgcHJvY2Vzc2VkICovCiAgd3BhbFJlYWRSZWdpc3RlcigweDAzMDgxNDAwKzB4MUQ0LCAmY3VyVGljayk7CgogIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICIlbGQgKCVsZC0lbGQpOiBEaXNhYmxlZCAleCBWYWxpZCAleCIsIGN1clRpY2sgPiByeFRpbWVTdGFtcCA/IGN1clRpY2sgLSByeFRpbWVTdGFtcCA6IHJ4VGltZVN0YW1wIC0gKDB4RkZGRkZGRkYgLSBjdXJUaWNrKSwKICAgIGN1clRpY2ssIHJ4VGltZVN0YW1wLCAgdWNTdGFUeERpc2FibGVkQml0bWFwLCB1Y1N0YVZhbGlkQml0bWFwKSk7CiNlbmRpZgogIGZvcih1Y1NUQUlkID0gMDsgdWNTdGFWYWxpZEJpdG1hcCAhPSAwOyB1Y1N0YVZhbGlkQml0bWFwID4+PTEsIHVjU3RhVHhEaXNhYmxlZEJpdG1hcCA+Pj0gMSwgdWNTVEFJZCArKykKICB7CiAgICBpZiAoICgwID09ICh1Y1N0YVZhbGlkQml0bWFwICYgMHgxKSkgfHwgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICYmICgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cykpICkKICAgICAgICBjb250aW51ZTsKCiAgICBpZiAodWNTdGFUeERpc2FibGVkQml0bWFwICYgMHgxKQogICAgewogICAgICBXTEFOVExfU3VzcGVuZERhdGFUeChwdm9zR0N0eCwgJnVjU1RBSWQsIE5VTEwpOwogICAgfQogICAgZWxzZQogICAgewogICAgICBXTEFOVExfUmVzdW1lRGF0YVR4KHB2b3NHQ3R4LCAmdWNTVEFJZCk7CiAgICB9CiAgfQoKI2Vsc2UKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKICB0cEhhbEZjUnhCZCAgICAgICAgIHB2RmNSeEJkID0gTlVMTDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjQml0Q2hlY2sgPSAweDE7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y1N0YVZhbGlkID0gMDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjU1RBSWQgPSAwOwoKICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgRkMgUmVzcG9uc2UiKTsKICBpZiAoIChOVUxMID09IHBUTENiKSB8fCAoTlVMTCA9PSBwdm9zRGF0YUJ1ZmYpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBvaW50ZXIgaW4gJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEoIHB2b3NEYXRhQnVmZiwgMCwgKHZfUFZPSURfdCkmcHZGY1J4QmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRIYWxGY1J4QmQpKTsKCiAgaWYgKCAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykgfHwgKE5VTEwgPT0gcHZGY1J4QmQpICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDp3cm9uZyBGQyBSeCBwYWNrZXQiKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQogIAogIC8vIG5lZWQgdG8gc3dhcCBieXRlcyBpbiB0aGUgRkMgY29udGVudHMuICAKICBXTEFOSEFMX1N3YXBGY1J4QmQoJnB2RmNSeEJkLT5mY1NUQVR4UUxlblswXSk7CgogIC8vbG9naWMgdG8gZW5hYmxlL2Rpc2FibGUgTFdNIG1vZGUgZm9yIGVhY2ggc3RhdGlvbgogIGZvciggdWNTdGFWYWxpZCA9ICh2X1U4X3QpcHZGY1J4QmQtPmZjU1RBVmFsaWRNYXNrOyB1Y1N0YVZhbGlkOyB1Y1N0YVZhbGlkID4+PSAxLCB1Y0JpdENoZWNrIDw8PSAxLCB1Y1NUQUlkICsrKQogIHsKICAgIGlmICggKDAgPT0gKHVjU3RhVmFsaWQgJiAweDEpKSB8fCAoMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0V4aXN0cykgKQogICAgewogICAgICBjb250aW51ZTsKICAgIH0KCiAgICBpZiAoIHB2RmNSeEJkLT5mY1NUQVRocmVzaEluZE1hc2sgJiB1Y0JpdENoZWNrICkKICAgIHsKICAgICAgLy9MV00gZXZlbnQgaXMgcmVwb3J0ZWQgYnkgRlcuIEFibGUgdG8gZmV0Y2ggbW9yZSBwYWNrZXQKICAgICAgaWYoIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTHdtTW9kZUVuYWJsZWQgKQogICAgICB7CiAgICAgICAgLy9Ob3cgbWVtb3J5IHVzYWdlIGlzIGJlbG93IExXTS4gU3RhdGlvbiBjYW4gc2VuZCBtb3JlIHBhY2tldHMuCiAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21FdmVudFJlcG9ydGVkID0gVFJVRTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6IEZXIHJlcG9ydCBMV00gZXZlbnQgYnV0IHRoZSBzdGF0aW9uICVkIGlzIG5vdCBpbiBMV00gbW9kZSIsIHVjU1RBSWQpKTsKICAgICAgfQogICAgfQoKICAgIC8vY2FsY3VsYXRlIHVFZ3Jlc3NfbGVuZ3RoL3VJbmdyZXNzX2xlbmd0aCBvbmx5IGFmdGVyIHJlY2VpdmluZyBlbm91Z2ggcGFja2V0cwogICAgaWYgKFdMQU5UTF9MV01fSU5HUkVTU19TQU1QTEVfVEhSRVNIT0xEIDw9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCkKICAgIHsKICAgICAgLy9jaGVjayBtZW1vcnkgdXNhZ2UgaW5mbyB0byBzZWUgd2hldGhlciBMV00gbW9kZSBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhlIHN0YXRpb24KICAgICAgdl9VMzJfdCB1RWdyZXNzX2xlbmd0aCA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCArIAogICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmJtdU1lbUNvbnN1bWVkIC0gcHZGY1J4QmQtPmZjU1RBVHhRTGVuW3VjU1RBSWRdOwoKICAgICAgLy9pZiAoKGZsb2F0KXVFZ3Jlc3NfbGVuZ3RoLyhmbG9hdClwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGggCiAgICAgIC8vICAgICAgPD0gV0xBTlRMX0xXTV9FR1JFU1NfSU5HUkVTU19USFJFU0hPTEQpCiAgICAgIGlmICggKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCA+IHVFZ3Jlc3NfbGVuZ3RoKSAmJgogICAgICAgICAgICgocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoIC0gdUVncmVzc19sZW5ndGggKSA+PSAKICAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCA+PiAyKSkKICAgICAgICAgKQogICAgICB7ICAgCiAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6RW5hYmxlIExXTSBtb2RlIGZvciBzdGF0aW9uICVkIiwgdWNTVEFJZCkpOwogICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkID0gVFJVRTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBpZiggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21Nb2RlRW5hYmxlZCApCiAgICAgICAgewogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpEaXNhYmxlIExXTSBtb2RlIGZvciBzdGF0aW9uICVkIiwgdWNTVEFJZCkpOwogICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21Nb2RlRW5hYmxlZCA9IEZBTFNFOwogICAgICAgIH0KCiAgICAgIH0KCiAgICAgIC8vcmVtZW1iZXIgbWVtb3J5IHVzYWdlIGluIEZXIHN0YXJ0aW5nIGZyb20gdGhpcyByb3VuZAogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5ibXVNZW1Db25zdW1lZCA9IHB2RmNSeEJkLT5mY1NUQVR4UUxlblt1Y1NUQUlkXTsKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoID0gMDsKICAgIH0gLy8oV0xBTlRMX0xXTV9JTkdSRVNTX1NBTVBMRV9USFJFU0hPTEQgPD0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoKQoKICAgIGlmKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkICkKICAgIHsKICAgICAgLy9hbHdheXMgdXBkYXRlIGN1cnJlbnQgbWF4aW11bSBhbGxvd2VkIG1lbWVvcnkgdXNhZ2UKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUJ1ZmZUaHJlc2hvbGRNYXggPSAgV0xBTlRMX1NUQV9CTVVfVEhSRVNIT0xEX01BWCAtCiAgICAgICAgcHZGY1J4QmQtPmZjU1RBVHhRTGVuW3VjU1RBSWRdOwogICAgfQoKICB9CiNlbmRpZgoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfUnhGcmFtZXMKCiAgREVTQ1JJUFRJT04KICAgIENhbGxiYWNrIHJlZ2lzdGVyZWQgYnkgVEwgYW5kIGNhbGxlZCBieSBCQUwgd2hlbiBhIHBhY2tldCBpcyByZWNlaXZlZAogICAgb3ZlciB0aGUgYnVzLiBVcG9uIHRoZSBjYWxsIG9mIHRoaXMgZnVuY3Rpb24gVEwgd2lsbCBtYWtlIHRoZSBuZWNlc3NhcnkKICAgIGRlY2lzaW9uIHdpdGggcmVnYXJkcyB0byB0aGUgZm9yd2FyZGluZyBvciBxdWV1aW5nIG9mIHRoaXMgcGFja2V0IGFuZAogICAgdGhlIGxheWVyIGl0IG5lZWRzIHRvIGJlIGRlbGl2ZXJlZCB0by4KCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIElmIHRoZSBmcmFtZSBjYXJyaWVkIGlzIGEgZGF0YSBmcmFtZSB0aGVuIHRoZSBzdGF0aW9uIGZvciB3aGljaCBpdCBpcwogICAgZGVzdGluZWQgdG8gbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggVEwuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIEJBTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogICAgdm9zRGF0YUJ1ZmY6ICAgaXQgd2lsbCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgYnVmZmVyIHJlY2VpdmVkLAogICAgICAgICAgICAgICAgICAgIGlmIHRoZXJlIGlzIG1vcmUgdGhlbiBvbmUgcGFja2V0IHRoZXkgd2lsbCBiZSBjaGFpbmVkCiAgICAgICAgICAgICAgICAgICAgdXNpbmcgdk9TUyBidWZmZXJzLgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfUnhGcmFtZXMKKAogIHZfUFZPSURfdCAgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCAgICAgKnBGcmFtZURhdGFCdWZmCikKewogIHZvc19wa3RfdCogICAgICAgICAgdm9zRGF0YUJ1ZmYgPSAodm9zX3BrdF90KilwRnJhbWVEYXRhQnVmZjsKICBXTEFOVExfQ2JUeXBlKiAgICAgIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgV0xBTlRMX1NUQUZ1bmNUeXBlICBwZm5TVEFGc207CiAgdm9zX3BrdF90KiAgICAgICAgICB2b3NUZW1wQnVmZjsKICB2X1U4X3QgICAgICAgICAgICAgIHVjU1RBSWQ7CiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y0ZybVR5cGU7CiAgdl9QVk9JRF90ICAgICAgICAgICBwdkJESGVhZGVyID0gTlVMTDsKICBXTEFOVExfU1RBRXZlbnRUeXBlIHdTVEFFdmVudCAgPSBXTEFOVExfUlhfRVZFTlQ7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y1RpZCAgICAgID0gMDsKICB2X0JPT0xfdCAgICAgICAgICAgIGJyb2FkY2FzdCAgPSBWT1NfRkFMU0U7CiAgdl9CT09MX3QgICAgICAgICAgICBzZWxmQmNhc3RMb29wYmFjayA9IFZPU19GQUxTRTsKICBzdGF0aWMgdl9VOF90ICAgICAgIGZpcnN0X2RhdGFfcGt0X2Fycml2ZWQ7CiAgdl9VMzJfdCAgICAgICAgICAgICB1RFBVU2lnOyAKICB2X1UxNl90ICAgICAgICAgICAgIHVzUGt0TGVuOwojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFNfSU5URVJOQUwgCiAgdl9VOF90ICAgICAgICAgICAgICB1Y01QRFVITGVuID0gMCA7CiAgdl9VMTZfdCAgICAgICAgICAgICB1c0V0aGVyVHlwZSA9IDA7CiNlbmRpZgogIHZfQk9PTF90ICAgICAgICAgICAgYkZvcndhcmRJQVBQd2l0aExMQyA9IFZPU19GQUxTRTsKI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCiAgdl9TN190ICAgICAgICAgICAgICBjdXJyZW50QXZnUlNTSSA9IDA7CiAgdl9VOF90ICAgICAgICAgICAgICBhYzsKCiNlbmRpZgoKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlRMIFJlY2VpdmUgRnJhbWVzIGNhbGxlZCIpKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUnhGcmFtZXMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBQb3BvbGF1dGUgdGltZXN0YW1wIGFzIHRoZSB0aW1lIHdoZW4gcGFja2V0IGFycml2ZXMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICB2b3NEYXRhQnVmZi0+dGltZXN0YW1wID0gdm9zX3RpbWVyX2dldF9zeXN0ZW1fdGlja3MoKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYXZlIHRoZSBpbml0aWFsIGJ1ZmZlciAtIHRoaXMgaXMgdGhlIGZpcnN0IHJlY2VpdmVkIGJ1ZmZlcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CgogIHdoaWxlICggTlVMTCAhPSB2b3NUZW1wQnVmZiApCiAgewogICAgYnJvYWRjYXN0ID0gVk9TX0ZBTFNFOwogICAgc2VsZkJjYXN0TG9vcGJhY2sgPSBWT1NfRkFMU0U7IAoKICAgIHZvc19wa3Rfd2Fsa19wYWNrZXRfY2hhaW4oIHZvc0RhdGFCdWZmLCAmdm9zRGF0YUJ1ZmYsIDEvKnRydWUqLyApOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIFBlZWsgYXQgQkQgaGVhZGVyIC0gZG8gbm90IHJlbW92ZQogICAgICAhISEgT3B0aW1pemUgbWU6IG9ubHkgcGFydCBvZiBoZWFkZXIgaXMgbmVlZGVkOyBub3QgZW50aXJlIG9uZQogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICB2b3NTdGF0dXMgPSBXREFfRFNfUGVla1J4UGFja2V0SW5mbyggdm9zVGVtcEJ1ZmYsICh2X1BWT0lEX3QpJnB2QkRIZWFkZXIsIDEvKlN3YXAgQkQqLyApOwoKICAgIGlmICggTlVMTCA9PSBwdkJESGVhZGVyICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBleHRyYWN0IEJEIGhlYWRlciIpKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgY29udGludWU7CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgQ2hlY2sgaWYgRkMgZnJhbWUgcmVwb3J0ZWQgZnJvbSBGVwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmKFdEQV9JU19SWF9GQyhwdkJESGVhZGVyKSkKICAgIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpyZWNlaXZlIG9uZSBGQyBmcmFtZSIpKTsKCiAgICAgIFdMQU5UTF9Qcm9jZXNzRkNGcmFtZShwdm9zR0N0eCwgdm9zVGVtcEJ1ZmYsIHB2QkRIZWFkZXIpOwogICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICAvKiBBTVNEVSBIVyBidWcgZml4CiAgICAgKiBBZnRlciAybmQgQU1TRFUgc3ViZnJhbWUgSFcgY291bGQgbm90IGhhbmRsZSBCRCBjb3JyZWN0bHkKICAgICAqIEhBTCB3b3JrYXJvdW5kIGlzIG5lZWRlZCAqLwogICAgaWYoV0RBX0dFVF9SWF9BU0YocHZCREhlYWRlcikpCiAgICB7CiAgICAgIFdEQV9EU19SeEFtc2R1QmRGaXgocHZvc0dDdHgsIHB2QkRIZWFkZXIpOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIEV4dHJhY3QgZnJhbWUgY29udHJvbCBmaWVsZCBmcm9tIDgwMi4xMSBoZWFkZXIgaWYgcHJlc2VudCAKICAgICAgKGZyYW1lIHRyYW5zbGF0aW9uIG5vdCBkb25lKSAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgdm9zU3RhdHVzID0gV0RBX0RTX0dldEZyYW1lVHlwZVN1YlR5cGUoIHB2b3NHQ3R4LCB2b3NUZW1wQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgIHB2QkRIZWFkZXIsICZ1Y0ZybVR5cGUgKTsKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBleHRyYWN0IEZyYW1lIENvbnRyb2wgRmllbGQiKSk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTX0lOVEVSTkFMCiAgICBpZiAoIFdMQU5UTF9JU19EQVRBX0ZSQU1FKHVjRnJtVHlwZSkpCiAgICB7CiAgICAgICB1Y01QRFVITGVuICAgID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfSEVBREVSX0xFTihwdkJESGVhZGVyKTsKICAgICAgIFdMQU5UTF9HZXRFdGhlclR5cGVfMihwdkJESGVhZGVyLCB2b3NUZW1wQnVmZiwgdWNNUERVSExlbiwgJnVzRXRoZXJUeXBlKSA7CiAgICB9CiNlbmRpZgogICAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCh2b3NUZW1wQnVmZiwgJnVzUGt0TGVuKTsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBDaGVjayBpZiBtYW5hZ2VtZW50IGFuZCBzZW5kIHRvIFBFCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmICggV0xBTlRMX0lTX01HTVRfRlJBTUUodWNGcm1UeXBlKSAKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTX0lOVEVSTkFMCiAgICAgICAgfHwgKFdMQU5UTF9JU19URExTX0ZSQU1FKHVzRXRoZXJUeXBlKSkgCiNlbmRpZgogICAgICAgKQogICAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJXTEFOIFRMOlNlbmRpbmcgcGFja2V0IHRvIG1hbmFnZW1lbnQgY2xpZW50IikpOwogICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NfcGt0X2ZsYXR0ZW5fcnhfcGt0KCZ2b3NUZW1wQnVmZikpCiAgICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDYW5ub3QgZmxhdHRlbiBwYWNrZXQgLSBkcm9wcGluZyIpKTsKICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB1Y1NUQUlkID0gKHZfVThfdClXREFfR0VUX1JYX1NUQUlEKCBwdkJESGVhZGVyICk7CiAgICAgIC8qIFJlYWQgUlNTSSBhbmQgdXBkYXRlICovCiAgICAgIGlmKCFXTEFOVExfU1RBX0lEX0lOVkFMSUQodWNTVEFJZCkpCiAgICAgIHsKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICAgICAgICAvKiBSZWFkIFJTU0kgYW5kIHVwZGF0ZSAqLwogICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9IU0hhbmRsZVJYRnJhbWUocHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTUdNVF9GUkFNRV9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKI2Vsc2UKICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfUmVhZFJTU0kocHZvc0dDdHgsIHB2QkRIZWFkZXIsIHVjU1RBSWQpOwojZW5kaWYKICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIYW5kbGUgUlggTWFuYWdlbWVudCBGcmFtZSBmYWlsIHdpdGhpbiBIYW5kb2ZmICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1cHBvcnQgbW9kdWxlIikpOwogICAgICAgICAgLyogRG8gTm90IERyb3AgcGFja2V0IGF0IGhlcmUKICAgICAgICAgICAqIFJldmlzaXQgd2h5IEhPIG1vZHVsZSByZXR1cm4gZmFpbAogICAgICAgICAgICogICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgICAgICogICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgICogICBjb250aW51ZTsKICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfUmVhZFNOUihwdm9zR0N0eCwgcHZCREhlYWRlciwgdWNTVEFJZCk7CgogICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCiAgICAgICAgewogICAgICAgICAgVExMT0dXKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJGYWlsZWQgdG8gUmVhZCBTTlIiKSkpOwogICAgICAgIH0KI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCiAgICAgICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwogICAgICAgIGlmICggTlVMTCAhPSBwQ2xpZW50U1RBKQogICAgICAgIHsKICAgICAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMubWdtdFJ4Kys7CiAgICAgICAgfQojZW5kaWYKICAgICAgfQoKICAgICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC5wZm5UbE1nbXRGcm1SeCggcHZvc0dDdHgsIHZvc1RlbXBCdWZmKTsgCiAgICB9CiAgICBlbHNlIC8qIERhdGEgRnJhbWUgKi8KICAgIHsKICAgICAgdWNTVEFJZCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9TVEFJRCggcHZCREhlYWRlciApOwogICAgICB1Y1RpZCAgID0gKHZfVThfdClXREFfR0VUX1JYX1RJRCggcHZCREhlYWRlciApOwojaWZkZWYgV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMKICAgICAgYWMgPSBXTEFOVExfVElEXzJfQUNbdWNUaWRdOwojZW5kaWYKCiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6RGF0YSBwYWNrZXQgcmVjZWl2ZWQgZm9yIFNUQSAlZCIsIHVjU1RBSWQpKTsKCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgVGhpcyBzaG91bGQgYmUgY29ycmVjdGVkIHdoZW4gbXVsdGlwZSBzdGEgc3VwcG9ydCBpcyBhZGRlZCAhISEKICAgICAgICBmb3Igbm93IGJjYXN0IGZyYW1lcyB3aWxsIGJlIHNlbnQgdG8gdGhlIGxhc3QgcmVnaXN0ZXJlZCBTVEEKICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIGlmICggV0RBX0lTX1JYX0JDQVNUKHB2QkRIZWFkZXIpKQogICAgICB7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAiV0xBTiBUTDpUTCByeCBCY2FzdCBmcmFtZSAtIHNlbmRpbmcgdG8gbGFzdCByZWdpc3RlcmVkIHN0YXRpb24iKSk7CiAgICAgICAgYnJvYWRjYXN0ID0gVk9TX1RSVUU7CiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICBJZiBBZGRyMSBpcyBiL21jYXN0LCBidXQgQWRkcjMgaXMgb3VyIG93biBzZWxmIE1BQywgaXQgaXMgYSBiL21jYXN0CiAgICAgICAgICBwa3Qgd2Ugc2VudCAgbG9vcGluZyBiYWNrIHRvIHVzLiBUbyBiZSBkcm9wcGVkIGlmIHdlIGFyZSBub24gQlRBTVAgIAogICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCiAgICAgICAgaWYoIFdMQU5IQUxfUlhfQkRfQUREUjNfU0VMRl9JRFggPT0gCiAgICAgICAgICAgICh2X1U4X3QpV0RBX0dFVF9SWF9BRERSM19JRFgoIHB2QkRIZWFkZXIgKSkgCiAgICAgICAgewogICAgICAgICAgc2VsZkJjYXN0TG9vcGJhY2sgPSBWT1NfVFJVRTsgCiAgICAgICAgfQogICAgICB9LyppZiBiY2FzdCovCgogICAgICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCh1Y1NUQUlkKSApCiAgICAgIHsKICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOlNUQSBJRCBpbnZhbGlkIC0gZHJvcHBpbmcgcGt0IikpOwogICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBObyBuZWVkIHRvIGxvY2sgY2FjaGUgYWNjZXNzIGJlY2F1c2UgY2FjaGUgbWFuaXB1bGF0aW9uIG9ubHkgaGFwcGVucwogICAgICAgIGluIHRoZSB0cmFuc3BvcnQgdGhyZWFkL3Rhc2sgY29udGV4dAogICAgICAgIC0gVGhlc2UgZnJhbWVzIGFyZSB0byBiZSBmb3J3YXJkZWQgdG8gdGhlIHN0YXRpb24gdXBvbiByZWdpc3RyYXRpb24KICAgICAgICAgIHdoaWNoIGhhcHBlbnMgaW4gdGhlIG1haW4gdGhyZWFkIGNvbnRleHQKICAgICAgICAgIFRoZSBjYWNoaW5nIGhlcmUgY2FuIGhhcHBlbiBpbiBlaXRoZXIgVHggb3IgUnggdGhyZWFkIGRlcGVuZGluZwogICAgICAgICAgb24gdGhlIGN1cnJlbnQgU1NDIHNjaGVkdWxpbmcKICAgICAgICAtIGFsc28gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZnJhbWVzIGluIHRoZSBjYWNoZSBhcmUgZndkLWVkIHRvCiAgICAgICAgICB0aGUgc3RhdGlvbiBiZWZvcmUgdGhlIG5ldyBpbmNvbWluZyBvbmVzIAogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKICAgICAgaWYgKE5VTEwgPT0gcENsaWVudFNUQSkKICAgICAgewogICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpTVEEgbm90IGFsbG9jYXRlZCBtZW1vcnkuIERyb3BwaW5nIHBhY2tldCIpKTsKICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgY29udGludWU7CiAgICAgIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogICAgICBpZiAoKCBwQ2xpZW50U1RBLT51Y0V4aXN0cyApICYmCiAgICAgICAgICAgKFdMQU5fU1RBX1RETFMgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpICYmCiAgICAgICAgICAgKHBDbGllbnRTVEEtPnVjVHhTdXNwZW5kZWQpKQogICAgICAgICAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1R4U3VzcGVuZGVkLCAwICk7CiAgICAgIGVsc2UgaWYgKCAhYnJvYWRjYXN0ICYmIChwQ2xpZW50U1RBLT51Y0V4aXN0cyA9PSAwICkgKQogICAgICB7CiAgICAgICAgICB0cFNpck1hY01nbXRIZHIgcE1hY0hlYWRlciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUiggcHZCREhlYWRlciApOwoKICAgICAgICAgIC8qIGZyb20gdGhlIGRpcmVjdCBwZWVyIHdoaWxlIGl0IGlzIG5vdCByZWdpc3RlcmVkIHRvIFRMIHlldCAqLwogICAgICAgICAgaWYgKCAocE1hY0hlYWRlci0+ZmMuZnJvbURTID09IDApICYmCiAgICAgICAgICAgICAgIChwTWFjSGVhZGVyLT5mYy50b0RTID09IDApICkKICAgICAgICAgIHsKICAgICAgICAgICAgICB2X1U4X3QgdWNBZGRyM1NUQUlkOwoKICAgICAgICAgICAgICB1Y0FkZHIzU1RBSWQgPSBXREFfR0VUX1JYX0FERFIzX0lEWChwdkJESGVhZGVyKTsKCiAgICAgICAgICAgICAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQodWNBZGRyM1NUQUlkKSApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOlNUQSBJRCAlZCBpbnZhbGlkIC0gZHJvcHBpbmcgcGt0IiwgdWNBZGRyM1NUQUlkKSk7CiAgICAgICAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmICghKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjQWRkcjNTVEFJZF0gJiYgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNBZGRyM1NUQUlkXS0+dWNFeGlzdHMgJiYKICAgICAgICAgICAgICAgICAgKFdMQU5fU1RBX0lORlJBID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjQWRkcjNTVEFJZF0tPndTVEFEZXNjLndTVEFUeXBlKSAmJgogICAgICAgICAgICAgICAgICAoV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjQWRkcjNTVEFJZF0tPnRsU3RhdGUpKSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHN0YUlkICVkIGFkZHIzSWQgJWQgdGxTdGF0ZSAlZC4gVW5rb3duIFJlY2VpdmVyL1RyYW5zbWl0dGVyIERyb3BwaW5nIHBhY2tldCIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCB1Y0FkZHIzU1RBSWQsIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjQWRkcjNTVEFJZF0tPnRsU3RhdGUpKTsKICAgICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHN0YUlkICVkIGRvZXNuJ3QgZXhpc3QsIGJ1dCBtYXBwZWQgdG8gQVAgc3RhSWQgJWQiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgdWNBZGRyM1NUQUlkKSk7CiAgICAgICAgICAgICAgICAgIHVjU1RBSWQgPSB1Y0FkZHIzU1RBSWQ7CiAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0FkZHIzU1RBSWRdOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfQojZW5kaWYKCiAgICAgIGlmICgoIHBDbGllbnRTVEEtPmVuYWJsZUNhY2hpbmcgPT0gMSApICYmCiAgICAgICAgICAgIC8qRG9udCBidWZmZXIgQnJvYWRjYXN0L011bHRpY2FzdCBmcmFtZXMuIElmIEFQIHRyYW5zbWl0cyBidXJzdHMgb2YgQnJvYWRjYXN0L011bHRpY2FzdCBkYXRhIGZyYW1lcywgCiAgICAgICAgICAgICAqIGxpYnJhIGJ1ZmZlcnMgYWxsIEJyb2FkY2FzdC9NdWx0aWNhc3QgcGFja2V0cyBhZnRlciBhdXRoZW50aWNhdGlvbiB3aXRoIEFQLCAKICAgICAgICAgICAgICogU28gaXQgd2lsbCBsZWFkIHRvIGxvdyByZXNvdXJjZSBjb25kaXRpb24gaW4gUnggRGF0YSBQYXRoLiovCiAgICAgICAgICAoIFdEQV9JU19SWF9CQ0FTVChwdkJESGVhZGVyKSA9PSAwICkpCiAgICAgIHsKICAgICAgICBpZiggV0RBX0lzU2VsZlNUQShwdm9zR0N0eCx1Y1NUQUlkKSkKICAgICAgICB7CiAgICAgICAgICAgLy9kcm9wIHBhY2tldCBmb3IgU2VsZiBTVEEgaW5kZXgKICAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgIiVzOiBQYWNrZXQgZHJvcHBlZCBmb3IgU2VsZiBTVEEgd2l0aCBzdGFJZCAlZCAiLCBfX2Z1bmNfXywgdWNTVEFJZCApKTsKCiAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB1RFBVU2lnID0gV0RBX0dFVF9SWF9EUFVTSUcoIHB2QkRIZWFkZXIgKTsKICAgICAgICAgIC8vU3RhdGlvbiBoYXMgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgd2l0aCBUTCAtIGNhY2hlIHRoZSBmcmFtZQogICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICIlczogc3RhSWQgJWQgZXhpc3QgJWQgdGxTdGF0ZSAlZCBjYWNoZSByeCBmcmFtZSIsIF9fZnVuY19fLCB1Y1NUQUlkLAogICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVjRXhpc3RzLCBwQ2xpZW50U1RBLT50bFN0YXRlKSk7CiAgICAgICAgV0xBTlRMX0NhY2hlU1RBRnJhbWUoIHBUTENiLCB1Y1NUQUlkLCB2b3NUZW1wQnVmZiwgdURQVVNpZywgYnJvYWRjYXN0LCB1Y0ZybVR5cGUpOwogICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRAogICAgICBpZiAoKHBDbGllbnRTVEEtPndTVEFEZXNjLnVjSXNFc2VTdGEpfHwgYnJvYWRjYXN0KQogICAgICB7CiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgRmlsdGVyIHRoZSBJQVBQIGZyYW1lcyBmb3IgRVNFIGNvbm5lY3Rpb247CiAgICAgICAgICBpZiBkYXRhIGl0IHdpbGwgcmV0dXJuIGZhbHNlIGFuZCBpdAogICAgICAgICAgd2lsbCBiZSByb3V0ZWQgdGhyb3VnaCB0aGUgcmVndWxhciBkYXRhIHBhdGgKICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAgaWYgKCBXTEFOVExfSXNJQVBQRnJhbWUocHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZikpCiAgICAgICAgewogICAgICAgICAgICBiRm9yd2FyZElBUFB3aXRoTExDID0gVk9TX1RSVUU7CiAgICAgICAgfQogICAgICB9CiNlbmRpZgoKI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgIWRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpCiAgICAgIGlmICgocENsaWVudFNUQS0+d1NUQURlc2MudWNJc0VzZVN0YSl8fCBicm9hZGNhc3QpCiAgICAgIHsKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICBGaWx0ZXIgdGhlIElBUFAgZnJhbWVzIGZvciBFU0UgY29ubmVjdGlvbjsKICAgICAgICAgIGlmIGRhdGEgaXQgd2lsbCByZXR1cm4gZmFsc2UgYW5kIGl0IAogICAgICAgICAgd2lsbCBiZSByb3V0ZWQgdGhyb3VnaCB0aGUgcmVndWxhciBkYXRhIHBhdGgKICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAgaWYgKCBXTEFOVExfSXNJQVBQRnJhbWUocHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZikpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NfcGt0X2ZsYXR0ZW5fcnhfcGt0KCZ2b3NUZW1wQnVmZikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDYW5ub3QgZmxhdHRlbiBwYWNrZXQgLSBkcm9wcGluZyIpKTsKICAgICAgICAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDogUmVjZWl2ZWQgRVNFIElBUFAgRnJhbWUiKSk7CgogICAgICAgICAgICAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnBmblRsTWdtdEZybVJ4KCBwdm9zR0N0eCwgdm9zVGVtcEJ1ZmYpOyAKICAgICAgICAgICAgfQogICAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KI2VuZGlmICAvKiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmICFkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKSAqLwoKICAgICAgaWYgKCBXTEFOX1NUQV9CVF9BTVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUgKQogICAgICB7CiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgUHJvY2VzcyB0aGUgY3RybCBCQVAgZnJhbWU7IGlmIGRhdGEgaXQgd2lsbCByZXR1cm4gZmFsc2UgYW5kIGl0IAogICAgICAgICAgd2lsbCBiZSByb3V0ZWQgdGhyb3VnaCB0aGUgcmVndWxhciBkYXRhIHBhdGgKICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAgaWYgKCBXTEFOVExfUHJvY2Vzc0JBUEZyYW1lKCBwdkJESGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0X2RhdGFfcGt0X2Fycml2ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkKSkKICAgICAgICB7CiAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9LyppZiBCVC1BTVAgc3RhdGlvbiovCiAgICAgIGVsc2UgaWYoc2VsZkJjYXN0TG9vcGJhY2sgPT0gVk9TX1RSVUUpCiAgICAgIHsgCiAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8gCiAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsgCiAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsgCiAgICAgICAgY29udGludWU7IAogICAgICB9IAogICAgICAKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBEYXRhIHBhY2tldCByZWNlaXZlZCwgc2VuZCB0byBzdGF0ZSBtYWNoaW5lCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIHdTVEFFdmVudCA9IFdMQU5UTF9SWF9FVkVOVDsKCiAgICAgIHBmblNUQUZzbSA9IHRsU1RBRnNtW3BDbGllbnRTVEEtPnRsU3RhdGVdLgogICAgICAgICAgICAgICAgICAgICAgcGZuU1RBVGJsW3dTVEFFdmVudF07CgogICAgICBpZiAoIE5VTEwgIT0gcGZuU1RBRnNtICkKICAgICAgewojaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwogICAgICAgIC8qIFJlYWQgUlNTSSBhbmQgdXBkYXRlICovCiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX0hTSGFuZGxlUlhGcmFtZShwdm9zR0N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9EQVRBX0ZSQU1FX1RZUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdkJESGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmKTsKICAgICAgICBicm9hZGNhc3QgPSBWT1NfRkFMU0U7CiNlbHNlCiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX1JlYWRSU1NJKHB2b3NHQ3R4LCBwdkJESGVhZGVyLCB1Y1NUQUlkKTsKI2VuZGlmCiAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKICAgICAgICB7CiAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgIkhhbmRsZSBSWCBEYXRhIEZyYW1lIGZhaWwgd2l0aGluIEhhbmRvZmYgc3VwcG9ydCBtb2R1bGUiKSk7CiAgICAgICAgICAvKiBEbyBOb3QgRHJvcCBwYWNrZXQgYXQgaGVyZSAKICAgICAgICAgICAqIFJldmlzaXQgd2h5IEhPIG1vZHVsZSByZXR1cm4gZmFpbAogICAgICAgICAgICogdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgICAqIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICAgKiBjb250aW51ZTsKICAgICAgICAgICAqLwogICAgICAgIH0KI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCiAgICAgICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwogICAgICAgIGlmICggTlVMTCAhPSBwQ2xpZW50U1RBKQogICAgICAgIHsKICAgICAgICAgICAgdHBTaXJNYWNNZ210SGRyIHBNYWNIZWFkZXIgPSBXREFfR0VUX1JYX01BQ19IRUFERVIoIHB2QkRIZWFkZXIgKTsKICAgICAgICAgICAgaWYgKCFJU19CUk9BRENBU1RfQUREKHBNYWNIZWFkZXItPmRhKSAmJiBJU19NVUxUSUNBU1RfQUREKHBNYWNIZWFkZXItPmRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1thY10ucnhNY2FzdCsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBXTEFOVExfSFNHZXREYXRhUlNTSShwdm9zR0N0eCwgcHZCREhlYWRlciwgdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAmY3VycmVudEF2Z1JTU0kpOwogICAgICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5yc3NpRGF0YSA9IGN1cnJlbnRBdmdSU1NJOwoKICAgICAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1thY10ucnhNcGR1Kys7CiAgICAgICAgICAgIGlmIChXREFfSVNfUlhfQU5fQU1QRFUgKHB2QkRIZWFkZXIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzW2FjXS5yeEFtcGR1Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKI2VuZGlmCiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX1JlYWRTTlIocHZvc0dDdHgsIHB2QkRIZWFkZXIsIHVjU1RBSWQpOwoKICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJGYWlsZWQgdG8gUmVhZCBTTlIiKSkpOwogICAgICAgIH0KCiAgICAgICAgcGZuU1RBRnNtKCBwdm9zR0N0eCwgdWNTVEFJZCwgJnZvc1RlbXBCdWZmLCBiRm9yd2FyZElBUFB3aXRoTExDKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICJXTEFOIFRMOk5VTEwgc3RhdGUgZnVuY3Rpb24sIFNUQTolZCwgU3RhdGU6ICVkLSBkcm9wcGluZyBwYWNrZXQiLAogICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dGxTdGF0ZSkpOwogICAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgfS8qIGVsc2UgZGF0YSBmcmFtZSovCgogICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICB9Lyp3aGlsZSBjaGFpbiovCgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUnhGcmFtZXMgKi8KCiNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9Db2xsZWN0SW50ZXJmYWNlU3RhdHMKCiAgREVTQ1JJUFRJT04KICAgIFV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSBUTCB0byBzZW5kIHRoZSBzdGF0aXRpY3MKCiAgREVQRU5ERU5DSUVTCgoKICBQQVJBTUVURVJTCgogICAgSU4KCiAgICB1Y1NUQUlkOiAgICBzdGF0aW9uIGZvciB3aGljaCB0aGUgc3RhdGlzdGljcyBuZWVkIHRvIGNvbGxlY3RlZAoKICAgIHZvc0RhdGFCdWZmOiBpdCB3aWxsIGNvbnRhaW4gdGhlIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgICAgICAgICAgIHN0cnVjdHVyZQoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfQ29sbGVjdEludGVyZmFjZVN0YXRzCigKICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQsCiAgV0xBTlRMX0ludGVyZmFjZVN0YXRzVHlwZSAgICAqdm9zRGF0YUJ1ZmYKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0NvbGxlY3RTdGF0cyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NvbGxlY3RTdGF0cyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAiV0xBTiBUTDogY29sbGVjdCBXSUZJX1NUQVRTX0lGQUNFIHJlc3VsdHMiKSk7CgogIHZvc19tZW1fY29weSh2b3NEYXRhQnVmZiwgJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5pbnRlcmZhY2VTdGF0cywKICAgICAgICAgIHNpemVvZihXTEFOVExfSW50ZXJmYWNlU3RhdHNUeXBlKSk7CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ2xlYXJJbnRlcmZhY2VTdGF0cwoKICBERVNDUklQVElPTgogICAgVXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IFRMIHRvIGNsZWFyIHRoZSBzdGF0aXRpY3MKCiAgREVQRU5ERU5DSUVTCgoKICBQQVJBTUVURVJTCgogICAgSU4KCiAgICB1Y1NUQUlkOiAgICBzdGF0aW9uIGZvciB3aGljaCB0aGUgc3RhdGlzdGljcyBuZWVkIHRvIGNvbGxlY3RlZAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfQ2xlYXJJbnRlcmZhY2VTdGF0cwooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICB1Y1NUQUlkLAogIHZfVThfdCAgICAgICAgICBzdGF0c0NsZWFyUmVxTWFzawopCnsKICAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBTYW5pdHkgY2hlY2sKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfQ29sbGVjdFN0YXRzIikpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogICAgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9Db2xsZWN0U3RhdHMiKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIH0KCiAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CiAgICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgICB7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICB9CgogICAgaWYgKChzdGF0c0NsZWFyUmVxTWFzayAmIFdJRklfU1RBVFNfSUZBQ0VfQUMpIHx8CiAgICAgICAgICAgIChzdGF0c0NsZWFyUmVxTWFzayAmIFdJRklfU1RBVFNfSUZBQ0UpKSB7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpjbGVhcmVkIFdJRklfU1RBVFNfSUZBQ0VfQUMgcmVzdWx0cyIpKTsKICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzBdLnJ4TWNhc3QgPSAwOwogICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbMV0ucnhNY2FzdCA9IDA7CiAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1syXS5yeE1jYXN0ID0gMDsKICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzNdLnJ4TWNhc3QgPSAwOwoKICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzBdLnJ4TXBkdSA9IDA7CiAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1sxXS5yeE1wZHUgPSAwOwogICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbMl0ucnhNcGR1ID0gMDsKICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzNdLnJ4TXBkdSA9IDA7CgogICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbMF0ucnhBbXBkdSA9IDA7CiAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1sxXS5yeEFtcGR1ID0gMDsKICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzJdLnJ4QW1wZHUgPSAwOwogICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbM10ucnhBbXBkdSA9IDA7CiAgICB9CgogICAgaWYgKHN0YXRzQ2xlYXJSZXFNYXNrICYgV0lGSV9TVEFUU19JRkFDRSkgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Y2xlYXJlZCBXSUZJX1NUQVRTX0lGQUNFIHJlc3VsdHMiKSk7CiAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMubWdtdFJ4ID0gMDsKICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5yc3NpRGF0YSA9IDA7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgIH0KCiAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgojZW5kaWYgLyogV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1J4Q2FjaGVkRnJhbWVzCgogIERFU0NSSVBUSU9OCiAgICBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgVEwgdG8gZm9yd2FyZCB0aGUgY2FjaGVkIGZyYW1lcyB0byBhIHBhcnRpY3VsYXIKICAgIHN0YXRpb247IAoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgogICAgSWYgdGhlIGZyYW1lIGNhcnJpZWQgaXMgYSBkYXRhIGZyYW1lIHRoZW4gdGhlIHN0YXRpb24gZm9yIHdoaWNoIGl0IGlzCiAgICBkZXN0aW5lZCB0byBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCBUTC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwVExDYjogICBwb2ludGVyIHRvIFRMIGhhbmRsZSAKICAgCiAgICB1Y1NUQUlkOiAgICBzdGF0aW9uIGZvciB3aGljaCB3ZSBuZWVkIHRvIGZvcndhcmQgdGhlIHBhY2tldHMKCiAgICB2b3NEYXRhQnVmZjogICBpdCB3aWxsIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjYWNoZWQgYnVmZmVyCiAgICAgICAgICAgICAgICAgICByZWNlaXZlZCwgaWYgdGhlcmUgaXMgbW9yZSB0aGVuIG9uZSBwYWNrZXQgdGhleSB3aWxsIGJlCiAgICAgICAgICAgICAgICAgICBjaGFpbmVkIHVzaW5nIHZPU1MgYnVmZmVycy4KCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1J4Q2FjaGVkRnJhbWVzCigKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IsCiAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmCikKewogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICBXTEFOVExfU1RBRnVuY1R5cGUgIHBmblNUQUZzbTsKICB2b3NfcGt0X3QqICAgICAgICAgIHZvc1RlbXBCdWZmOwogIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzOwogIHZfUFZPSURfdCAgICAgICAgICAgcHZCREhlYWRlciA9IE5VTEw7CiAgV0xBTlRMX1NUQUV2ZW50VHlwZSB3U1RBRXZlbnQgID0gV0xBTlRMX1JYX0VWRU5UOwogIHZfVThfdCAgICAgICAgICAgICAgdWNUaWQgICAgICA9IDA7CiAgdl9CT09MX3QgICAgICAgICAgICBicm9hZGNhc3QgID0gVk9TX0ZBTFNFOwogIHZfQk9PTF90ICAgICAgICAgICAgYlNpZ01hdGNoICA9IFZPU19GQUxTRTsgCiAgdl9CT09MX3QgICAgICAgICAgICBzZWxmQmNhc3RMb29wYmFjayA9IFZPU19GQUxTRTsKICBzdGF0aWMgdl9VOF90ICAgICAgIGZpcnN0X2RhdGFfcGt0X2Fycml2ZWQ7CiAgdl9VMzJfdCAgICAgICAgICAgICB1RFBVU2lnOyAKICB2X1U4X3QgICAgICAgICAgICAgIHVjVWNhc3RTaWc7IAogIHZfVThfdCAgICAgICAgICAgICAgdWNCY2FzdFNpZzsgCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpUTCBSZWNlaXZlIENhY2hlZCBGcmFtZXMgY2FsbGVkIikpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSB2b3NEYXRhQnVmZiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9SeEZyYW1lcyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsIFRSQUNFX0NPREVfVExfRk9SV0FSRF9DQUNIRURfRlJBTUVTLAogICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgMTw8MTYgfCBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZVNpemUpKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhdmUgdGhlIGluaXRpYWwgYnVmZmVyIC0gdGhpcyBpcyB0aGUgZmlyc3QgcmVjZWl2ZWQgYnVmZmVyCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKCiAgd2hpbGUgKCBOVUxMICE9IHZvc1RlbXBCdWZmICkKICB7CiAgICBicm9hZGNhc3QgPSBWT1NfRkFMU0U7CiAgICBzZWxmQmNhc3RMb29wYmFjayA9IFZPU19GQUxTRTsgCgogICAgdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggdm9zRGF0YUJ1ZmYsICZ2b3NEYXRhQnVmZiwgMS8qdHJ1ZSovICk7CgogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6U2VuZGluZyBuZXcgY2FjaGVkIHBhY2tldCB0byBzdGF0aW9uICVkIiwgdWNTVEFJZCkpOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgUGVlayBhdCBCRCBoZWFkZXIgLSBkbyBub3QgcmVtb3ZlCiAgICAgICEhISBPcHRpbWl6ZSBtZTogb25seSBwYXJ0IG9mIGhlYWRlciBpcyBuZWVkZWQ7IG5vdCBlbnRpcmUgb25lCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHZvc1N0YXR1cyA9IFdEQV9EU19QZWVrUnhQYWNrZXRJbmZvKCB2b3NUZW1wQnVmZiwgKHZfUFZPSURfdCkmcHZCREhlYWRlciwgMCApOwoKICAgIGlmICggTlVMTCA9PSBwdkJESGVhZGVyICkKICAgICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBleHRyYWN0IEJEIGhlYWRlciIpKTsKICAgICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICB1RFBVU2lnID0gV0RBX0dFVF9SWF9EUFVTSUcoIHB2QkRIZWFkZXIgKTsKCiAgICAvKiBBTVNEVSBIVyBidWcgZml4CiAgICAgKiBBZnRlciAybmQgQU1TRFUgc3ViZnJhbWUgSFcgY291bGQgbm90IGhhbmRsZSBCRCBjb3JyZWN0bHkKICAgICAqIEhBTCB3b3JrYXJvdW5kIGlzIG5lZWRlZCAqLwogICAgaWYoV0RBX0dFVF9SWF9BU0YocHZCREhlYWRlcikpCiAgICB7CiAgICAgIFdEQV9EU19SeEFtc2R1QmRGaXgodm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1RMLHBUTENiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2QkRIZWFkZXIpOwogICAgfQoKICAgIHVjVGlkICAgPSAodl9VOF90KVdEQV9HRVRfUlhfVElEKCBwdkJESGVhZGVyICk7CgogICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpEYXRhIHBhY2tldCBjYWNoZWQgZm9yIFNUQSAlZCIsIHVjU1RBSWQpOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIFRoaXMgc2hvdWxkIGJlIGNvcnJlY3RlZCB3aGVuIG11bHRpcGUgc3RhIHN1cHBvcnQgaXMgYWRkZWQgISEhCiAgICAgIGZvciBub3cgYmNhc3QgZnJhbWVzIHdpbGwgYmUgc2VudCB0byB0aGUgbGFzdCByZWdpc3RlcmVkIFNUQQogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAoIFdEQV9JU19SWF9CQ0FTVChwdkJESGVhZGVyKSkKICAgIHsKICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6VEwgcnggQmNhc3QgZnJhbWUgIikpOwogICAgICBicm9hZGNhc3QgPSBWT1NfVFJVRTsKCiAgICAgIC8qIElmIEFkZHIxIGlzIGIvbWNhc3QsIGJ1dCBBZGRyMyBpcyBvdXIgb3duIHNlbGYgTUFDLCBpdCBpcyBhIGIvbWNhc3QgCiAgICAgICAqIHBrdCB3ZSBzZW50IGxvb3BpbmcgYmFjayB0byB1cy4gVG8gYmUgZHJvcHBlZCBpZiB3ZSBhcmUgbm9uIEJUQU1QICAKICAgICAgICovIAogICAgICBpZiggV0xBTkhBTF9SWF9CRF9BRERSM19TRUxGX0lEWCA9PSAKICAgICAgICAgICh2X1U4X3QpV0RBX0dFVF9SWF9BRERSM19JRFgoIHB2QkRIZWFkZXIgKSkgCiAgICAgIHsKICAgICAgICBzZWxmQmNhc3RMb29wYmFjayA9IFZPU19UUlVFOyAKICAgICAgfQogICAgfS8qaWYgYmNhc3QqLwoKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgQ2hlY2sgaWYgdGhlIHBhY2tldCB0aGF0IHdlIGNhY2hlZCBtYXRjaGVzIHRoZSBEUFUgc2lnbmF0dXJlIG9mIHRoZQogICAgICBuZXdseSBhZGRlZCBzdGF0aW9uIAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogICAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgfQoKICAgIGlmICggYnJvYWRjYXN0ICkKICAgIHsKICAgICAgdWNCY2FzdFNpZyA9ICh2X1U4X3QpdURQVVNpZzsKICAgICAgYlNpZ01hdGNoID0gKCggV0xBTl9UTF9JTlZBTElEX0JfU0lHICE9IAogICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcgKSAmJgogICAgICAgICggdWNCY2FzdFNpZyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnICkpOwogICAgfQogICAgZWxzZQogICAgewogICAgICB1Y1VjYXN0U2lnID0gKHZfVThfdCl1RFBVU2lnOwogICAgICBiU2lnTWF0Y2ggPSAoKCBXTEFOX1RMX0lOVkFMSURfVV9TSUcgIT0gCiAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnICkgJiYKICAgICAgICAgICggdWNVY2FzdFNpZyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnICkpOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBJZiB0aGUgcGFja2V0IGRvZXNuJ3QgbWF0Y2ggLSBkcm9wIGl0IAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAoICFiU2lnTWF0Y2ggKQogICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCiAgICAgICAgIldMQU4gVEw6IENhY2hlZCBwYWNrZXQgZG9lcyBub3QgbWF0Y2ggRFBVIFNpZyBvZiB0aGUgbmV3IFNUQSAtIGRyb3AgIgogICAgICAgICIgRFBVIFNpZyAlZCAgVUMgJWQgQkMgJWQgQiAlZCIsCiAgICAgICAgdURQVVNpZywKICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnLAogICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcsCiAgICAgICAgYnJvYWRjYXN0KSk7CgogICAgICAvKiBEcm9wIHBhY2tldCAqLyAKICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsgCiAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7IAogICAgICBjb250aW51ZTsgCgogICAgfS8qaWYgc2lnbmF0dXJlIG1pc21hdGNoKi8KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBDaGVjayBpZiBCVC1BTVAgZnJhbWU6CiAgICAgIC0gYWRkaXRpb25hbCBwcm9jZXNzaW5nIG5lZWRlZCBpbiB0aGlzIGNhc2UgdG8gc2VwYXJhdGUgQlQtQU1QIGRhdGUKICAgICAgICBmcm9tIEJULUFNUCBDdHJsIHBhdGggCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYgKCBXTEFOX1NUQV9CVF9BTVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUgKQogICAgewogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgUHJvY2VzcyB0aGUgY3RybCBCQVAgZnJhbWU7IGlmIGRhdGEgaXQgd2lsbCByZXR1cm4gZmFsc2UgYW5kIGl0IAogICAgICAgIHdpbGwgYmUgcm91dGVkIHRocm91Z2ggdGhlIHJlZ3VsYXIgZGF0YSBwYXRoCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgaWYgKCBXTEFOVExfUHJvY2Vzc0JBUEZyYW1lKCBwdkJESGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0X2RhdGFfcGt0X2Fycml2ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCkpCiAgICAgIHsKICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0vKmlmIEJULUFNUCBzdGF0aW9uKi8KICAgICAgZWxzZSBpZihzZWxmQmNhc3RMb29wYmFjayA9PSBWT1NfVFJVRSkKICAgICAgeyAKICAgICAgICAvKiBEcm9wIHBhY2tldCAqLyAKICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOyAKICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOyAKICAgICAgICBjb250aW51ZTsgCiAgICAgIH0gCiAgICAgIAogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIERhdGEgcGFja2V0IHJlY2VpdmVkLCBzZW5kIHRvIHN0YXRlIG1hY2hpbmUKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgd1NUQUV2ZW50ID0gV0xBTlRMX1JYX0VWRU5UOwoKICAgICAgcGZuU1RBRnNtID0gdGxTVEFGc21bcENsaWVudFNUQS0+dGxTdGF0ZV0uCiAgICAgICAgICAgICAgICAgICAgICBwZm5TVEFUYmxbd1NUQUV2ZW50XTsKCiAgICAgIGlmICggTlVMTCAhPSBwZm5TVEFGc20gKQogICAgICB7CiNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCiAgICAgICAgLyogUmVhZCBSU1NJIGFuZCB1cGRhdGUgKi8KICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfSFNIYW5kbGVSWEZyYW1lKHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX01PRFVMRV9JRF9UTCxwVExDYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfREFUQV9GUkFNRV9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZik7CiAgICAgICAgYnJvYWRjYXN0ID0gVk9TX0ZBTFNFOwojZWxzZQogICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9SZWFkUlNTSSh2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfVEwscFRMQ2IpLCBwdkJESGVhZGVyLCB1Y1NUQUlkKTsKI2VuZGlmCiAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiSGFuZGxlIFJYIERhdGEgRnJhbWUgZmFpbCB3aXRoaW4gSGFuZG9mZiBzdXBwb3J0IG1vZHVsZSIpKTsKICAgICAgICAgIC8qIERvIE5vdCBEcm9wIHBhY2tldCBhdCBoZXJlIAogICAgICAgICAgICogUmV2aXNpdCB3aHkgSE8gbW9kdWxlIHJldHVybiBmYWlsCiAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICovCiAgICAgICAgfQogICAgICAgIHBmblNUQUZzbSggdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1RMLHBUTENiKSwgdWNTVEFJZCwgCiAgICAgICAgICAgICAgICAgJnZvc1RlbXBCdWZmLCBWT1NfRkFMU0UpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6TlVMTCBzdGF0ZSBmdW5jdGlvbiwgU1RBOiVkLCBTdGF0ZTogJWQtIGRyb3BwaW5nIHBhY2tldCIsCiAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCBwQ2xpZW50U1RBLT50bFN0YXRlKSk7CiAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogIH0vKndoaWxlIGNoYWluKi8KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SeENhY2hlZEZyYW1lcyAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9SeFByb2Nlc3NNc2cKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBWT1NTIHdoZW4gYSBtZXNzYWdlIHdhcyBzZXJpYWxpemVkIGZvciBUTCB0aHJvdWdoIHRoZQogICAgcnggdGhyZWFkL3Rhc2suCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIG1lc3NhZ2U6ICAgICAgICB0eXBlIGFuZCBjb250ZW50IG9mIHRoZSBtZXNzYWdlCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBPdGhlciB2YWx1ZXMgY2FuIGJlIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGEgZnVuY3Rpb24gY2FsbCwgcGxlYXNlIGNoZWNrCiAgY29ycmVzcG9uZGluZyBBUEkgZm9yIG1vcmUgaW5mby4KICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9SeFByb2Nlc3NNc2cKKAogIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgsCiAgdm9zX21zZ190KiAgICAgICBtZXNzYWdlCikKewogICBWT1NfU1RBVFVTICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogICB2X1UzMl90ICAgICAgICAgdURhdGE7CiAgIHZfVThfdCAgICAgICAgICB1Y1NUQUlkOwogICB2X1U4X3QgICAgICAgICAgdWNVY2FzdFNpZzsKICAgdl9VOF90ICAgICAgICAgIHVjQmNhc3RTaWc7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gbWVzc2FnZSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9SeFByb2Nlc3NNZXNzYWdlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBQcm9jZXNzIG1lc3NhZ2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmVjZWl2ZWQgbWVzc2FnZTogJWQgdGhyb3VnaCByeCBmbG93IiwgbWVzc2FnZS0+dHlwZSkpOwoKICBzd2l0Y2goIG1lc3NhZ2UtPnR5cGUgKQogIHsKCiAgY2FzZSBXTEFOVExfUlhfRldEX0NBQ0hFRDoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgVGhlIGRhdGEgc2VudCB3aXRoIHRoZSBtZXNzYWdlIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKICAgICAgIHwgMDAgfCB1Y0JjYXN0U2lnbmF0dXJlIHwgdWNVY2FzdFNpZ25hdHVyZSB8IHVjU1RBSUQgfAogICAgICAgZWFjaCBmaWVsZCBhYm92ZSBpcyBvbmUgYnl0ZQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHVEYXRhICAgICAgID0gbWVzc2FnZS0+Ym9keXZhbDsKICAgIHVjU1RBSWQgICAgID0gKCB1RGF0YSAmIDB4MDAwMDAwRkYpOwogICAgdWNVY2FzdFNpZyAgPSAoIHVEYXRhICYgMHgwMDAwRkYwMCk+Pjg7CiAgICB1Y0JjYXN0U2lnICA9ICh2X1U4X3QpKCggdURhdGEgJiAweDAwRkYwMDAwKT4+MTYpOwogICAgdm9zU3RhdHVzICAgPSBXTEFOVExfRm9yd2FyZFNUQUZyYW1lcyggcHZvc0dDdHgsIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1VjYXN0U2lnLCB1Y0JjYXN0U2lnKTsKICAgIGJyZWFrOwoKICBkZWZhdWx0OgogICAgLypubyBwcm9jZXNzaW5nIGZvciBub3cqLwogICAgYnJlYWs7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9SZXNvdXJjZUNCCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgdGhlIFRMIHdoZW4gaXQgaGFzIHBhY2tldHMgYXZhaWxhYmxlIGZvciB0cmFuc21pc3Npb24uCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIEJBTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBCQUwncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9SZXNvdXJjZUNCCigKICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgsCiAgdl9VMzJfdCAgICAgICAgIHVDb3VudAopCnsKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcFRMQ2ItPnVSZXNDb3VudCA9IHVDb3VudDsKCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlc3VtZSBUeCBpZiBlbm91Z2ggcmVzIGFuZCBub3Qgc3VzcGVuZGVkCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfTUYgKSAmJgogICAgICAoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAiV0xBTiBUTDpJc3N1aW5nIFhtaXQgc3RhcnQgcmVxdWVzdCB0byBCQUwgZm9yIGF2YWlsIHJlcyBBU1lOQyIpKTsKICAgIHJldHVybiBXREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUmVzb3VyY2VDQiAqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgIFdMQU5UTF9Jc1R4WG1pdFBlbmRpbmcKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSB0aGUgV0RBIHdoZW4gaXQgd2FudHMgdG8ga25vdyB3aGV0aGVyIFdEQV9EU19UWF9TVEFSVF9YTUlUIG1zZwogICAgaXMgcGVuZGluZyBpbiBUTCBtc2cgcXVldWUgCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFdEQSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBXREEncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgMDogICBObyBXREFfRFNfVFhfU1RBUlRfWE1JVCBtc2cgcGVuZGluZyAKICAgIDE6ICAgTXNnIFdEQV9EU19UWF9TVEFSVF9YTUlUIGFscmVhZHkgcGVuZGluZyBpbiBUTCBtc2cgcXVldWUgCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZfQk9PTF90CldMQU5UTF9Jc1R4WG1pdFBlbmRpbmcKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eAopCnsKCiAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggaW4gV0xBTlRMX0lzVHhYbWl0UGVuZGluZyAiKSk7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICByZXR1cm4gcFRMQ2ItPmlzVHhUcmFubWl0TXNnUGVuZGluZzsKCn0vKldMQU5UTF9Jc1R4WG1pdFBlbmRpbmcgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgIFdMQU5UTF9TZXRUeFhtaXRQZW5kaW5nCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgdGhlIFdEQSB3aGVuIGl0IHdhbnRzIHRvIGluZGljYXRlIHRoYXQgV0RBX0RTX1RYX1NUQVJUX1hNSVQgbXNnCiAgICBpcyBwZW5kaW5nIGluIFRMIG1zZyBxdWV1ZSAKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggV0RBIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFdEQSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRSAgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnZfVk9JRF90CldMQU5UTF9TZXRUeFhtaXRQZW5kaW5nCigKICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgKKQp7CgogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IGluIFdMQU5UTF9TZXRUeFhtaXRQZW5kaW5nIikpOwogICAgcmV0dXJuOwogIH0KCiAgcFRMQ2ItPmlzVHhUcmFubWl0TXNnUGVuZGluZyA9IDE7CiAgcmV0dXJuOwoKfS8qV0xBTlRMX1NldFR4WG1pdFBlbmRpbmcgICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICBXTEFOVExfQ2xlYXJUeFhtaXRQZW5kaW5nCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgdGhlIFdEQSB3aGVuIGl0IHdhbnRzIHRvIGluZGljYXRlIHRoYXQgbm8gV0RBX0RTX1RYX1NUQVJUX1hNSVQgbXNnCiAgICBpcyBwZW5kaW5nIGluIFRMIG1zZyBxdWV1ZSAKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggV0RBIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFdEQSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRSAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdl9WT0lEX3QKV0xBTlRMX0NsZWFyVHhYbWl0UGVuZGluZwooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4CikKewoKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBpbiBXTEFOVExfQ2xlYXJUeFhtaXRQZW5kaW5nICIpKTsKICAgIHJldHVybjsKICB9CgogIHBUTENiLT5pc1R4VHJhbm1pdE1zZ1BlbmRpbmcgPSAwOwogIHJldHVybjsKfS8qV0xBTlRMX0NsZWFyVHhYbWl0UGVuZGluZyAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgV0xBTlRMX1R4VGhyZWFkRGVidWdIYW5kbGVyCgogIERFU0NSSVBUSU9OCiAgICBQcmludGluZyBUTCBTbmFwc2hvdCBkdW1wLCBwcm9jZXNzZWQgdW5kZXIgVHhUaHJlYWQgY29udGV4dCwgY3VycmVudGx5CiAgICBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGdsb2JhbCBUbENiIHN0cnV0dXJlLiBEdW1wcyBpbmZvcm1hdGlvbiByZWxhdGVkCiAgICB0byBwZXIgYWN0aXZlIFNUQSBjb25uZWN0aW9uIGN1cnJlbnRseSBpbiB1c2UgYnkgVEwuCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFdEQSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRSAgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnZfVk9JRF90CldMQU5UTF9UeFRocmVhZERlYnVnSGFuZGxlcgooCiB2X1BWT0lEX3QgKnBWb3NDb250ZXh0CikKewogICBXTEFOVExfQ2JUeXBlKiBwVExDYiA9IE5VTEw7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAgaW50IGkgPSAwOwogICB2X1U4X3QgdUZsb3dNYXNrOyAvLyBUWCBGbG93TWFzayBmcm9tIFdEQQoKICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICJXTEFOIFRMOiAlcyBFbnRlciAiLCBfX2Z1bmNfXykpOwoKICAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHBWb3NDb250ZXh0KTsKCiAgIGlmICggTlVMTCA9PSBwVm9zQ29udGV4dCB8fCBOVUxMID09IHBUTENiICkKICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiR2xvYmFsIFZvUyBDb250ZXh0IG9yIFRMIENvbnRleHQgYXJlIE5VTEwiKSk7CiAgICAgICAgcmV0dXJuOwogICB9CgogICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTID09IFdEQV9EU19HZXRUeEZsb3dNYXNrKHBWb3NDb250ZXh0LCAmdUZsb3dNYXNrKSkKICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXREEgdVR4Rmxvd01hc2s6IDB4JXgiLCB1Rmxvd01hc2spKTsKICAgfQoKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqVEwgRFVNUCBJTkZPUk1BVElPTioqKioqKioqKioqKioqIikpOwoKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAidURlbGF5ZWRUcmlnZ2VyRnJtSW50OiVkXHR1TWluRnJhbWVzUHJvY1RocmVzOiVkIiwKICAgICAgICAgIHBUTENiLT50bENvbmZpZ0luZm8udURlbGF5ZWRUcmlnZ2VyRnJtSW50LAogICAgICAgICAgcFRMQ2ItPnRsQ29uZmlnSW5mby51TWluRnJhbWVzUHJvY1RocmVzKSk7CgogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJNYW5hZ2VtZW50IEZyYW1lIENsaWVudCBleGlzdHM6ICVkIiwKICAgICAgICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMpKTsKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAidXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50OiAlZFx0dWNUeFN1c3BlbmRlZDogJWQiLAogICAgICAgICAgcFRMQ2ItPnVzUGVuZGluZ1R4Q29tcGxldGVDb3VudCwKICAgICAgICAgIHBUTENiLT51Y1R4U3VzcGVuZGVkKSk7CgogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJ1UmVzQ291bnQ6ICVkIiwgcFRMQ2ItPnVSZXNDb3VudCkpOwoKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAidWNSZWdpc3RlcmVkU3RhSWQ6ICVkXHR1Y0N1cnJlbnRTVEE6ICVkIiwKICAgICAgICAgIHBUTENiLT51Y1JlZ2lzdGVyZWRTdGFJZCwgcFRMQ2ItPnVjQ3VycmVudFNUQSkpOwoKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiVXJnZW50RnJhbWVQcm9jZXNzaW5nOiAlc1x0dUZyYW1lc1Byb2NUaHJlczogJWQiLAogICAgICAgICAgKHBUTENiLT5iVXJnZW50PyJUcnVlIjoiRmFsc2UiKSwgcFRMQ2ItPnVGcmFtZXNQcm9jVGhyZXMpKTsKCiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgImlzVHhUcmFubWl0TXNnUGVuZGluZzogJWRcdCBpc0JNUFM6ICVzIiwKICAgICAgICAgIHBUTENiLT5pc1R4VHJhbm1pdE1zZ1BlbmRpbmcsIHBUTENiLT5pc0JNUFM/IlRydWUiOiJGYWxzZSIpKTsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJURExTIFBlZXIgQ291bnQ6ICVkIiwgcFRMQ2ItPnVjVGRsc1BlZXJDb3VudCkpOwojZW5kaWYKCiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIisrKysrKysrKysrKysrKysrKysrUmVnaXN0ZXJkIENsaWVudCBJbmZvcm1hdGlvbisrKysrKysrKysiKSk7CgogICBmb3IgKCBpID0wOyBpPFdMQU5fTUFYX1NUQV9DT1VOVDsgaSsrICkKICAgewogICAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXTsKICAgICAgICBpZiggTlVMTCA9PSBwQ2xpZW50U1RBIHx8IDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMpCiAgICAgICAgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1NUQSBJbmRleDogJWQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIsaSkpOwogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiV0xBTl9TVEFEZXNjVHlwZToiKSk7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIlNUQUlkOiAlZFx0IFNUQSBNQUMgQWRkcmVzczogJXBNIiwgcENsaWVudFNUQS0+d1NUQURlc2MudWNTVEFJZCwKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy52U1RBTUFDQWRkcmVzcy5ieXRlcykpOwogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJTVEEgVHlwZTogJWRcdFByb3RlY3RlZEZyYW1lOiAlZCIsCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUsIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUHJvdGVjdGVkRnJhbWUpKTsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIlFvUzogJWRcdFJ4RnJhbWVUcmFuczogJWRcdFR4RnJhbWVUcmFuczogJWQiLAogICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQsIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU3dGcmFtZVJYWGxhdGlvbiwKICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uKSk7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgInVjVWNhc3RTaWc6ICVkXHR1Y0JjYXN0U2lnOiAlZCIsIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcsCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNCY2FzdFNpZykpOwoKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiQ2xpZW50SW5kZXg6ICVkXHQgRXhpc3RzOiAlZCIsIGksIHBDbGllbnRTVEEtPnVjRXhpc3RzKSk7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIlRMIFN0YXRlOiAlZFx0IFRMIFByaW9yaXR5OiAlZCIsIHBDbGllbnRTVEEtPnRsU3RhdGUsCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+dGxQcmkpKTsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAidWNUeFN1c3BlbmRlZDogJWRcdHVjUGt0UGVuZGluZzogJWQiLCBwQ2xpZW50U1RBLT51Y1R4U3VzcGVuZGVkLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVjUGt0UGVuZGluZykpOwogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJ1Y0VBUE9MUGt0UGVuZGluZzogJWRcdHVjTm9Nb3JlRGF0YTogJWQiLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVjRWFwb2xQa3RQZW5kaW5nLCBwQ2xpZW50U1RBLT51Y05vTW9yZURhdGEpKTsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgImVuYWJsZUNhY2hpbmc6ICVkXHQgZmNTdGFUeERpc2FibGVkOiAlZCIsIHBDbGllbnRTVEEtPmVuYWJsZUNhY2hpbmcsCiAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPmZjU3RhVHhEaXNhYmxlZCkpOwogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAidWNDdXJyZW50QUM6ICVkXHR1Y1NlcnZpY2VkQUM6ICVkIiwgcENsaWVudFNUQS0+dWNDdXJyZW50QUMsCiAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVjU2VydmljZWRBQykpOwogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJUSUQ6ICVkXHRhdXRUeENvdW50WzBdOiAlZFx0YXVSeENvdW50WzBdOiAlZCIsMCwgcENsaWVudFNUQS0+YXVUeENvdW50WzBdLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPmF1UnhDb3VudFswXSkpOwogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJhdWNBY01hc2tbMF06ICVkXHRhdWNBY01hc2tbMV06ICVkXHRhdWNBY01hc2tbMl06ICVkXHRhdWNBY01hc2tbM106ICVkXHQiLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPmF1Y0FDTWFza1swXSwgcENsaWVudFNUQS0+YXVjQUNNYXNrWzFdLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPmF1Y0FDTWFza1syXSwgcENsaWVudFNUQS0+YXVjQUNNYXNrWzNdKSk7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJ1Y0N1cnJlbnRXZWlnaHQ6ICVkIiwgcENsaWVudFNUQS0+dWNDdXJyZW50V2VpZ2h0KSk7CgogICAgICAgIGlmKCBXTEFOX1NUQV9TT0ZUQVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIlRyYWZmaWNTdGF0aXN0aWNzIGZvciBTT0ZUQVAgU3RhdGlvbjoiKSk7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiUlVGPSVkXHRSTUY9JWRcdFJCRj0lZCIsIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnJ4VUNGY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnJ4TUNGY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnJ4QkNGY250KSk7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiUlVCPSVkXHRSTUI9JWRcdFJCQj0lZCIsIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnJ4VUNCY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnJ4TUNCY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnJ4QkNCY250KSk7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiVFVGPSVkXHRUTUY9JWRcdFRCRj0lZCIsIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4VUNGY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4TUNGY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4QkNGY250KSk7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiVFVCPSVkXHRUTUI9JWRcdFRCQj0lZCIsIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4VUNCY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4TUNCY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4QkNCY250KSk7CiAgICAgICAgfQogICAgfQogICByZXR1cm47Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgIFdMQU5UTF9GYXRhbEVycm9ySGFuZGxlcgoKICBERVNDUklQVElPTgogICAgSGFuZGxlIEZhdGFsIGVycm9ycyBkZXRlY3RlZCBvbiB0aGUgVFggcGF0aC4KICAgIEN1cnJlbnRseSBpc3N1ZXMgU1NSIHRvIHJlY292ZXIgZnJvbSB0aGUgZXJyb3IuCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFdEQSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRSAgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdl9WT0lEX3QKV0xBTlRMX0ZhdGFsRXJyb3JIYW5kbGVyCigKIHZfUFZPSURfdCAqcFZvc0NvbnRleHQKKQp7CgogICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgIldMQU4gVEw6ICVzIEVudGVyICIsIF9fZnVuY19fKSk7CgogICBpZiAoIE5VTEwgPT0gcFZvc0NvbnRleHQgKQogICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICIlczogR2xvYmFsIFZvUyBDb250ZXh0IG9yIFRMIENvbnRleHQgYXJlIE5VTEwiLAogICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybjsKICAgfQoKICAgLyoKICAgICogSXNzdWUgU1NSLiB2b3Nfd2xhblJlc3RhcnQgaGFzIHRpZ2h0IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdAogICAgKiB3ZSBkbyBub3Qgc2VuZCBhbiBGSVEgaWYgcHJldmlvdXMgRklRIGlzIG5vdCBwcm9jZXNzZWQKICAgICovCiAgIHZvc193bGFuUmVzdGFydCgpOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICBXTEFOVExfVExEZWJ1Z01lc3NhZ2UKCiAgREVTQ1JJUFRJT04KICAgIFBvc3QgYSBUTCBTbmFwc2hvdCByZXF1ZXN0LCBwb3N0cyBtZXNzYWdlIGluIFR4VGhyZWFkLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGdldHMgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIGRpc3BsYXlTbmFwc2hvdCBCb29sZWFuIHNob3dpbmcgd2hldGhlciB0byBkdW1wIHRoZSBzbmFwc2hvdCBvciBub3QuCgogIFJFVFVSTiBWQUxVRSAgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnZfVk9JRF90CldMQU5UTF9UTERlYnVnTWVzc2FnZQooCiB2X1UzMl90IGRlYnVnRmxhZ3MKKQp7CiAgIHZvc19tc2dfdCB2b3NNc2c7CiAgIFZPU19TVEFUVVMgc3RhdHVzOwoKICAgaWYoZGVidWdGbGFncyAmIFdMQU5UTF9ERUJVR19UWF9TTkFQU0hPVCkKICAgewogICAgICAgIHZvc01zZy5yZXNlcnZlZCA9IDA7CiAgICAgICAgdm9zTXNnLmJvZHlwdHIgID0gTlVMTDsKICAgICAgICB2b3NNc2cudHlwZSAgICAgPSBXTEFOVExfVFhfU05BUFNIT1Q7CgogICAgICAgIHN0YXR1cyA9IHZvc190eF9tcV9zZXJpYWxpemUoIFZPU19NT0RVTEVfSURfVEwsICZ2b3NNc2cpOwogICAgICAgIGlmKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIlRYIE1zZyBQb3N0aW5nIEZhaWxlZCB3aXRoIHN0YXR1czogJWQiLHN0YXR1cykpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICB9CiAgIGlmIChkZWJ1Z0ZsYWdzICYgV0xBTlRMX0RFQlVHX0ZXX0NMRUFOVVApCiAgIHsKICAgICAgICB2b3NNc2cucmVzZXJ2ZWQgPSAwOwogICAgICAgIHZvc01zZy5ib2R5cHRyICA9IE5VTEw7CiAgICAgICAgdm9zTXNnLnR5cGUgICAgID0gV0xBTlRMX1RYX0ZXX0RFQlVHOwoKICAgICAgICBzdGF0dXMgPSB2b3NfdHhfbXFfc2VyaWFsaXplKCBWT1NfTU9EVUxFX0lEX1RMLCAmdm9zTXNnKTsKICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJUWCBNc2cgUG9zdGluZyBGYWlsZWQgd2l0aCBzdGF0dXM6ICVkIixzdGF0dXMpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgfQogICByZXR1cm47Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgIFdMQU5UTF9GYXRhbEVycm9yCgogIERFU0NSSVBUSU9OCiAgICBGYXRhbCBlcnJvciByZXBvcnRlZCBpbiBUWCBwYXRoLCBwb3N0IGFuIGV2ZW50IHRvIFRYIFRocmVhZCBmb3IgZnVydGhlcgogICAgaGFuZGxpbmcKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIFZPSUQKCiAgUkVUVVJOIFZBTFVFICAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdl9WT0lEX3QKV0xBTlRMX0ZhdGFsRXJyb3IKKAogdl9WT0lEX3QKKQp7CiAgIHZvc19tc2dfdCB2b3NNc2c7CiAgIFZPU19TVEFUVVMgc3RhdHVzOwoKICAgdm9zTXNnLnJlc2VydmVkID0gMDsKICAgdm9zTXNnLmJvZHlwdHIgID0gTlVMTDsKICAgdm9zTXNnLnR5cGUgICAgID0gV0xBTlRMX1RYX0ZBVEFMX0VSUk9SOwoKICAgc3RhdHVzID0gdm9zX3R4X21xX3NlcmlhbGl6ZSggVk9TX01PRFVMRV9JRF9UTCwgJnZvc01zZyk7CiAgIGlmKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCiAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFRYIE1zZyBQb3N0aW5nIEZhaWxlZCB3aXRoIHN0YXR1czogJWQiLAogICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyxzdGF0dXMpKTsKICAgfQogICByZXR1cm47Cn0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMIFNUQVRFIE1BQ0hJTkUKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVR4Q29ubgoKICBERVNDUklQVElPTgogICAgVHJhbnNtaXQgaW4gY29ubmVjdGVkIHN0YXRlIC0gb25seSBFQVBPTCBhbmQgV0FJIHBhY2tldHMgYWxsb3dlZAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHR4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgIE90aGVyIHJldHVybiB2YWx1ZXMgYXJlIHBvc3NpYmxlIGNvbWluZyBmcm9tIHRoZSBjYWxsZWQgZnVuY3Rpb25zLgogICBQbGVhc2UgY2hlY2sgQVBJIGZvciBhZGRpdGlvbmFsIGluZm8uCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVR4Q29ubgooCiAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYsCiAgdl9CT09MX3QgICAgICBiRm9yd2FyZElBUFB3aXRoTExDCikKewogICB2X1UxNl90ICAgICAgICAgICAgICB1c1BrdExlbjsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgdm9zU3RhdHVzOwogICB2X01BQ0FERFJfdCAgICAgICAgICB2RGVzdE1hY0FkZHI7CiAgIHZvc19wa3RfdCogICAgICAgICAgIHZvc0RhdGFCdWZmID0gTlVMTDsKICAgV0xBTlRMX0NiVHlwZSogICAgICAgcFRMQ2IgICAgICAgPSBOVUxMOwogICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgIFdMQU5UTF9NZXRhSW5mb1R5cGUgIHRsTWV0YUluZm87CiAgIHZfVThfdCAgICAgICAgICAgICAgIHVjVHlwZVN1YnR5cGUgPSAwOwogICB2X1U4X3QgICAgICAgICAgICAgICB1Y1RpZDsKICAgdl9VOF90ICAgICAgICAgICAgICAgZXh0cmFIZWFkU3BhY2UgPSAwOwogICB2X1U4X3QgICAgICAgICAgICAgICB1Y1dEU0VuYWJsZWQgPSAwOwogICB2X1U4X3QgICAgICAgICAgICAgICB1Y0FDLCB1Y0FDTWFzaywgaTsgCiAgIHZfVTMyX3QgICAgICAgICAgICAgIHR4RmxhZyA9IEhBTF9UWF9OT19FTkNSWVBUSU9OX01BU0s7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1NUQVR4Q29ubiIpOwogICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBEaXNhYmxlIEFDIHRlbXBvcmFyeSAtIGlmIHN1Y2Nlc3NmdWxsIHJldHJpZXZlIHJlLWVuYWJsZQogICAgICBUaGUgb3JkZXIgaXMganVzdGlmaWVkIGJlY2F1c2Ugb2YgdGhlIHBvc3NpYmxlIHNjZW5hcmlvCiAgICAgICAtIFRMIHRyeWVzIHRvIGZldGNoIHBhY2tldCBmb3IgQUMgYW5kIGl0IHJldHVybnMgTlVMTAogICAgICAgLSBUTCBhbmFseXplcyB0aGUgZGF0YSBpdCBoYXMgcmVjZWl2ZWQgdG8gc2VlIGlmIHRoZXJlIGFyZQogICAgICAgYW55IG1vcmUgcGt0cyBhdmFpbGFibGUgZm9yIEFDIC0+IGlmIG5vdCBUTCB3aWxsIGRpc2FibGUgQUMKICAgICAgIC0gaG93ZXZlciBpdCBpcyBwb3NzaWJsZSB0aGF0IHdoaWxlIGFuYWx5emluZyByZXN1bHRzIFRMIGdvdAogICAgICAgcHJlZW1wdGVkIGJ5IGEgcGVuZGluZyBpbmRpY2F0aW9uIHdoZXJlIHRoZSBtYXNrIHdhcyBhZ2FpbiBzZXQKICAgICAgIFRMIHdpbGwgbm90IGNoZWNrIGFnYWluIGFuZCBhcyBhIHJlc3VsdCB3aGVuIGl0IHJlc3VtZXMKICAgICAgIGV4ZWN1dGlvbiBpdCB3aWxsIGRpc2FibGUgQUMKICAgICAgIFRvIHByZXZlbnQgdGhpcyB0aGUgQUMgd2lsbCBiZSBkaXNhYmxlZCBoZXJlIGFuZCBpZiByZXRyaWV2ZQogICAgICAgaXMgc3VjY2Vzc2Z1bGwgaXQgd2lsbCBiZSByZS1lbmFibGVkCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKICAvL0xUSTpwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS4KICAvL0xUSTogICBhdWNBQ01hc2tbcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNDdXJyZW50QUNdID0gMDsgCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBGZXRjaCBwYWNrZXQgZnJvbSBIREQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgaWYgKChXTEFOX1NUQV9TT0ZUQVAgIT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpICYmCiAgICAgICEodm9zX2NvbmN1cnJlbnRfb3Blbl9zZXNzaW9uc19ydW5uaW5nKCkpICYmCiAgICAgICFwVExDYi0+dWNUZGxzUGVlckNvdW50KQogIHsKI2Vsc2UKICBpZiAoKFdMQU5fU1RBX1NPRlRBUCAhPSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkgJiYKICAgICAgISh2b3NfY29uY3VycmVudF9vcGVuX3Nlc3Npb25zX3J1bm5pbmcoKSkpCiAgewojZW5kaWYKICAgICAgdWNBQyA9IHBDbGllbnRTVEEtPnVjQ3VycmVudEFDOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgRGlzYWJsZSBBQyB0ZW1wb3JhcnkgLSBpZiBzdWNjZXNzZnVsbCByZXRyaWV2ZSByZS1lbmFibGUKICAgICAgVGhlIG9yZGVyIGlzIGp1c3RpZmllZCBiZWNhdXNlIG9mIHRoZSBwb3NzaWJsZSBzY2VuYXJpbwogICAgICAgLSBUTCB0cnllcyB0byBmZXRjaCBwYWNrZXQgZm9yIEFDIGFuZCBpdCByZXR1cm5zIE5VTEwKICAgICAgIC0gVEwgYW5hbHl6ZXMgdGhlIGRhdGEgaXQgaGFzIHJlY2VpdmVkIHRvIHNlZSBpZiB0aGVyZSBhcmUKICAgICAgIGFueSBtb3JlIHBrdHMgYXZhaWxhYmxlIGZvciBBQyAtPiBpZiBub3QgVEwgd2lsbCBkaXNhYmxlIEFDCiAgICAgICAtIGhvd2V2ZXIgaXQgaXMgcG9zc2libGUgdGhhdCB3aGlsZSBhbmFseXppbmcgcmVzdWx0cyBUTCBnb3QKICAgICAgIHByZWVtcHRlZCBieSBhIHBlbmRpbmcgaW5kaWNhdGlvbiB3aGVyZSB0aGUgbWFzayB3YXMgYWdhaW4gc2V0CiAgICAgICBUTCB3aWxsIG5vdCBjaGVjayBhZ2FpbiBhbmQgYXMgYSByZXN1bHQgd2hlbiBpdCByZXN1bWVzCiAgICAgICBleGVjdXRpb24gaXQgd2lsbCBkaXNhYmxlIEFDCiAgICAgICBUbyBwcmV2ZW50IHRoaXMgdGhlIEFDIHdpbGwgYmUgZGlzYWJsZWQgaGVyZSBhbmQgaWYgcmV0cmlldmUKICAgICAgIGlzIHN1Y2Nlc3NmdWxsIGl0IHdpbGwgYmUgcmUtZW5hYmxlZAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBwQ2xpZW50U1RBLT5hdWNBQ01hc2tbdWNBQ10gPSAwOwogIH0KICBlbHNlCiAgewogICAgICAvL3NvZnRhcCBjYXNlCiAgICAgIHVjQUMgPSBwVExDYi0+dUN1clNlcnZlZEFDOwogICAgICBwQ2xpZW50U1RBLT5hdWNBQ01hc2tbdWNBQ10gPSAwOwogIH0KCiAgICAvKllvdSBtYWtlIGFuIGluaXRpYWwgYXNzdW1wdGlvbiB0aGF0IEhERCBoYXMgbm8gbW9yZSBkYXRhIGFuZCBpZiB0aGUKICAgICAgYXNzdW1wdGlvbiB3YXMgd3JvbmcgeW91IHJlc2V0IHRoZSBmbGFncyB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZQogICAgIFRoaXMgd2lsbCBwcmV2ZW50IGZyb20gZXhwb3NpbmcgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIGNoZWNraW5nIHdpdGggSERECiAgICAgZm9yIHBhY2tldHMgYW5kIHNldHRpbmcgdGhlIGZsYWdzIHRvIGZhbHNlKi8KICAvL0xUSTogdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y1BrdFBlbmRpbmcsIDApOwogIC8vTFRJOiBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y05vTW9yZURhdGEgPSAxOwogIHZvc19hdG9taWNfc2V0X1U4KCAmcENsaWVudFNUQS0+dWNQa3RQZW5kaW5nLCAwKTsKICBXTEFOX1RMX0FDX0FSUkFZXzJfTUFTSyggcENsaWVudFNUQSwgdWNBQ01hc2ssIGkpOwogICAgLypZb3UgbWFrZSBhbiBpbml0aWFsIGFzc3VtcHRpb24gdGhhdCBIREQgaGFzIG5vIG1vcmUgZGF0YSBhbmQgaWYgdGhlCiAgICAgICAgICAgYXNzdW1wdGlvbiB3YXMgd3JvbmcgeW91IHJlc2V0IHRoZSBmbGFncyB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZQogICAgICAgICAgIFRoaXMgd2lsbCBwcmV2ZW50IGZyb20gZXhwb3NpbmcgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIGNoZWNraW5nIHdpdGggSERECiAgICAgICAgICAgZm9yIHBhY2tldHMgYW5kIHNldHRpbmcgdGhlIGZsYWdzIHRvIGZhbHNlKi8KICBpZiAoIDAgPT0gdWNBQ01hc2sgKQogIHsKICAgICAgcENsaWVudFNUQS0+dWNOb01vcmVEYXRhID0gMTsKICB9CiAgZWxzZQogIHsKICAgICAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1BrdFBlbmRpbmcsIDEpOwogIH0KCgogIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICJXTEFOIFRMOiBXTEFOVExfU1RBVHhDb25uIGZldGNoaW5nIHBhY2tldCBmcm9tIEhERCBmb3IgQUM6ICVkIEFDIE1hc2s6ICVkIFBrdCBQZW5kaW5nOiAlZCIsIAogICAgICAgICAgICAgdWNBQywgdWNBQ01hc2ssIHBDbGllbnRTVEEtPnVjUGt0UGVuZGluZyk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBGZXRjaCB0eCBwYWNrZXQgZnJvbSBIREQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgdm9zU3RhdHVzID0gcENsaWVudFNUQS0+cGZuU1RBRmV0Y2hQa3QoIHB2b3NHQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y0FDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvc0RhdGFCdWZmLCAmdGxNZXRhSW5mbyApOwoKICBpZiAoKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkgfHwgKCBOVUxMID09IHZvc0RhdGFCdWZmICkpCiAgewogICAgVExMT0cxKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICJXTEFOIFRMOk5vIG1vcmUgZGF0YSBhdCBIREQgc3RhdHVzICVkIiwgdm9zU3RhdHVzKSk7CiAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZXNldCBBQyBmb3IgdGhlIHNlcnZpY2VkIHN0YXRpb24gdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgQUMKICAgIC0+IGR1ZSB0byBubyBtb3JlIGRhdGEgYXQgdGhlIHN0YXRpb24KICAgIEV2ZW4gaWYgdGhpcyBBQyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzdGF0aW9uLCBjb3JyZWN0aW9uIHdpbGwgYmUKICAgIG1hZGUgaW4gdGhlIG1haW4gVEwgbG9vcAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgcENsaWVudFNUQS0+dWNDdXJyZW50QUMgICAgID0gV0xBTlRMX0FDX1ZPOwogICAgcENsaWVudFNUQS0+dWNDdXJyZW50V2VpZ2h0ID0gMDsKCiAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICJXTEFOIFRMOiBXTEFOVExfU1RBVHhDb25uIG5vIG1vcmUgcGFja2V0cyBpbiBIREQgZm9yIEFDOiAlZCBBQyBNYXNrOiAlZCIsIAogICAgICAgICAgICAgICB1Y0FDLCB1Y0FDTWFzayk7CgogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qVGhlcmUgYXJlIHN0aWxsIHBhY2tldHMgaW4gSEREIC0gc2V0IGJhY2sgdGhlIHBlbmRpbmcgcGFja2V0cyBhbmQgCiAgIHRoZSBubyBtb3JlIGRhdGEgYXNzdW1wdGlvbiovCiAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1BrdFBlbmRpbmcsIDEpOwogIHBDbGllbnRTVEEtPnVjTm9Nb3JlRGF0YSA9IDA7CiAgcENsaWVudFNUQS0+YXVjQUNNYXNrW3VjQUNdID0gMTsKCiNpZmRlZiBXTEFOX1BFUkYgCiAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX0JBTCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkwKTsKCiNlbmRpZiAvKldMQU5fUEVSRiovCgoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJZiB0aGUgcGFja2V0IGlzIG5laXRoZXIgYW4gRWFwb2wgcGFja2V0IG5vciBhIFdBSSBwYWNrZXQgdGhlbiBkcm9wIGl0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIGlmICggMCA9PSB0bE1ldGFJbmZvLnVjSXNFYXBvbCAmJiAwID09IHRsTWV0YUluZm8udWNJc1dhaSApCiAgIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgICJXTEFOIFRMOk9ubHkgRUFQT0wgb3IgV0FJIHBhY2tldHMgYWxsb3dlZCBiZWZvcmUgYXV0aGVudGljYXRpb24iKSk7CgogICAgIC8qIEZhaWwgdHggZm9yIHBhY2tldCAqLwogICAgIHBDbGllbnRTVEEtPnBmblNUQVR4Q29tcCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfU1RBVFVTX0VfQkFETVNHKTsKICAgICB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CiNlbHNlCiAgIGlmICggMCA9PSB0bE1ldGFJbmZvLnVjSXNFYXBvbCApCiAgewogICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpSZWNlaXZlZCBub24gRUFQT0wgcGFja2V0IGJlZm9yZSBhdXRoZW50aWNhdGlvbiIpKTsKCiAgICAvKiBGYWlsIHR4IGZvciBwYWNrZXQgKi8KICAgIHBDbGllbnRTVEEtPnBmblNUQVR4Q29tcCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfU1RBVFVTX0VfQkFETVNHKTsKICAgIHZvc0RhdGFCdWZmID0gTlVMTDsKICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgQ2hlY2sgVElECiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdWNUaWQgICAgID0gdGxNZXRhSW5mby51Y1RJRDsKCiAgLypNYWtlIHN1cmUgVElEIGlzIHZhbGlkKi8KICBpZiAoIFdMQU5UTF9USURfSU5WQUxJRCh1Y1RpZCkpIAogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRJRCBzZW50IGluIG1ldGEgaW5mbyAlZCAtIGRlZmF1bHRpbmcgdG8gMCAoQkUpIiwgCiAgICAgICAgICAgICB1Y1RpZCkpOwogICAgIHVjVGlkID0gMDsgCiAgfQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6QXR0YWNoaW5nIEJEIGhlYWRlciB0byBwa3Qgb24gV0xBTlRMX1NUQVR4Q29ubiIpKTsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUcmFuc2xhdGUgODAyLjMgZnJhbWUgdG8gODAyLjExIGlmIEZyYW1lIHRyYW5zbGF0aW9uIGlzIGVuYWJsZWQgb3IgaWYgCiAgICBmcmFtZSBpcyBhIFdBSSBmcmFtZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoICggMSA9PSB0bE1ldGFJbmZvLnVjSXNXYWkgKSB8fAogICAgICAgKCAwID09IHRsTWV0YUluZm8udWNEaXNhYmxlRnJtWHRsICkgKQojZWxzZQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUcmFuc2xhdGUgODAyLjMgZnJhbWUgdG8gODAyLjExIGlmIEZyYW1lIHRyYW5zbGF0aW9uIGlzIGVuYWJsZWQgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAoIDAgPT0gdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwgKSAmJgogICAgICAoIDAgIT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uKSApCiNlbmRpZiAvLyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogIHsKICAgIHZvc1N0YXR1cyA9ICBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIoIHZvc0RhdGFCdWZmLCAmdm9zU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2IsICZ1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRsTWV0YUluZm8sICZ1Y1dEU0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0cmFIZWFkU3BhY2UpOwogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RXJyb3Igd2hlbiB0cmFuc2xhdGluZyBoZWFkZXIgV0xBTlRMX1NUQVR4Q29ubiIpKTsKCiAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CgogICAgdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwgPSAxOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDYWxsIEhBTCB0byBmaWxsIEJEIGhlYWRlcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y1R5cGVTdWJ0eXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9UWVBFIDw8IDQpOwoKICBpZiAoIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCApCiAgewogICAgdWNUeXBlU3VidHlwZSB8PSAoV0xBTlRMXzgwMjExX0RBVEFfUU9TX1NVQlRZUEUpOwogIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogIC8qIFRMIFN0YXRlIGRvZXMgbm90IHRyYW5zaXRpb24gdG8gQVVUSEVOVElDQVRFRCB0aWxsIEdUSyBpcyBpbnN0YWxsZWQsIFNvIGluCiAgICogY2FzZSBvZiBXUEEgd2hlcmUgR1RLIGhhbmRzaGFrZSBpcyBkb25lIGFmdGVyIHRoZSA0IHdheSBoYW5kc2hha2UsIHRoZQogICAqIHVuaWNhc3QgMi8yIEVBUE9MIHBhY2tldCBmcm9tIHRoZSBTVEEtPkFQIGhhcyB0byBiZSBlbmNyeXB0ZWQgZXZlbiBiZWZvcmUKICAgKiB0aGUgVEwgaXMgaW4gYXV0aGVudGljYXRlZCBzdGF0ZS4gU2luY2UgdGhlIFBUSyBoYXMgYmVlbiBpbnN0YWxsZWQKICAgKiBhbHJlYWR5IChhZnRlciB0aGUgNCB3YXkgaGFuZHNoYWtlKSB3ZSBtYWtlIHN1cmUgdGhhdCBhbGwgdHJhZmZpYwogICAqIGlzIGVuY3J5cHRlZCBoZW5jZWZvcnRoLihOb3RlOiBUTCBpcyBzdGlsbCBub3QgaW4gQVVUSEVOVElDQVRFRCBzdGF0ZSBzbwogICAqIHdlIHdpbGwgb25seSBhbGxvdyBFQVBPTCBkYXRhIG9yIFdBSSBpbiBjYXNlIG9mIFdBUEkpCiAgICovCiAgaWYgKHRsTWV0YUluZm8udWNJc0VhcG9sICYmIHBDbGllbnRTVEEtPnB0a0luc3RhbGxlZCkKICB7CiAgICB0eEZsYWcgPSAwOwogIH0KI2Vsc2UKICBpZiAocENsaWVudFNUQS0+cHRrSW5zdGFsbGVkKQogIHsKICAgIHR4RmxhZyA9IDA7CiAgfQojZW5kaWYKCiAgdm9zU3RhdHVzID0gKFZPU19TVEFUVVMpV0RBX0RTX0J1aWxkVHhQYWNrZXRJbmZvKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYgLCAmdkRlc3RNYWNBZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRsTWV0YUluZm8udWNEaXNhYmxlRnJtWHRsLCAmdXNQa3RMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNRb3NFbmFibGVkLCB1Y1dEU0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFIZWFkU3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdWNUeXBlU3VidHlwZSwgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1RpZCwgdHhGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRsTWV0YUluZm8udXNUaW1lU3RhbXAsIHRsTWV0YUluZm8udWNJc0VhcG9sIHx8IHRsTWV0YUluZm8udWNJc1dhaSwgdGxNZXRhSW5mby51Y1VQICk7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGZpbGwgQkQgJWQiLCB2b3NTdGF0dXMpKTsKICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFVwZGF0ZSB0eCBjb3VudGVyIGZvciBCQSBzZXNzaW9uIHF1ZXJ5IGZvciB0eCBzaWRlCiAgICAhMSAtIHNob3VsZCB0aGlzIGJlIGRvbmUgZm9yIEVBUE9MIGZyYW1lcz8KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwQ2xpZW50U1RBLT5hdVR4Q291bnRbdWNUaWRdKys7CgogIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgKHZfUFZPSURfdClwQ2xpZW50U1RBLT5wZm5TVEFUeENvbXAgKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhdmUgZGF0YSB0byBpbnB1dCBwb2ludGVyIGZvciBUTCBjb3JlCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAqcHZvc0RhdGFCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgLypzZWN1cml0eSBmcmFtZXMgY2Fubm90IGJlIGRlbGF5ZWQqLwogIHBUTENiLT5iVXJnZW50ICAgICAgPSBUUlVFOwoKICAvKiBUWCBTdGF0aXN0aWNzICovCiAgaWYgKCEodGxNZXRhSW5mby51Y0JjYXN0IHx8IHRsTWV0YUluZm8udWNNY2FzdCkpCiAgewogICAgLyogVGhpcyBpcyBUWCBVQyBmcmFtZSAqLwogICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0ZjbnQrKzsKICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4VUNCY250ICs9IHVzUGt0TGVuOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TVEFUeENvbm4gKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVR4QXV0aAoKICBERVNDUklQVElPTgogICAgVHJhbnNtaXQgaW4gYXV0aGVudGljYXRlZCBzdGF0ZSAtIGFsbCBkYXRhIGFsbG93ZWQKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgU1RBIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGJlaW5nIHByb2Nlc3NlZAogICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSB0eCB2b3MgYnVmZmVyCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICBPdGhlciByZXR1cm4gdmFsdWVzIGFyZSBwb3NzaWJsZSBjb21pbmcgZnJvbSB0aGUgY2FsbGVkIGZ1bmN0aW9ucy4KICAgUGxlYXNlIGNoZWNrIEFQSSBmb3IgYWRkaXRpb25hbCBpbmZvLgoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TVEFUeEF1dGgKKAogIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICB1Y1NUQUlkLAogIHZvc19wa3RfdCoqICAgcHZvc0RhdGFCdWZmLAogIHZfQk9PTF90ICAgICAgYkZvcndhcmRJQVBQd2l0aExMQwopCnsKICAgdl9VMTZfdCAgICAgICAgICAgICAgIHVzUGt0TGVuOwogICBWT1NfU1RBVFVTICAgICAgICAgICAgdm9zU3RhdHVzOwogICB2X01BQ0FERFJfdCAgICAgICAgICAgdkRlc3RNYWNBZGRyOwogICB2b3NfcGt0X3QqICAgICAgICAgICAgdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICBXTEFOVExfQ2JUeXBlKiAgICAgICAgcFRMQ2IgICAgICAgPSBOVUxMOwogICBXTEFOVExfTWV0YUluZm9UeXBlICAgdGxNZXRhSW5mbzsKICAgdl9VOF90ICAgICAgICAgICAgICAgIHVjVHlwZVN1YnR5cGUgPSAwOwogICBXTEFOVExfQUNFbnVtVHlwZSAgICAgdWNBQzsKICAgV0xBTlRMX0FDRW51bVR5cGUgICAgIHVjTmV4dEFDOwogICB2X1U4X3QgICAgICAgICAgICAgICAgdWNUaWQ7CiAgIHZfVThfdCAgICAgICAgICAgICAgICB1Y1N3RnJtWHRsID0gMDsKICAgdl9VOF90ICAgICAgICAgICAgICAgIGV4dHJhSGVhZFNwYWNlID0gMDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUgKnBTdGFDbGllbnQgPSBOVUxMOwogICB2X1U4X3QgICAgICAgICAgICAgICAgdWNXRFNFbmFibGVkID0gMDsKICAgdl9VMzJfdCAgICAgICAgICAgICAgIHVjVHhGbGFnICAgPSAwOwogICB2X1U4X3QgICAgICAgICAgICAgICAgdWNBQ01hc2ssIGk7CiAgIHZfVThfdCAgICAgICAgICAgICAgICBwcmV2U3RhSWQ7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgKCBOVUxMID09IHB2b3NEYXRhQnVmZiApKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgaW5wdXQgcGFyYW1zIG9uIFdMQU5UTF9TVEFUeEF1dGggVEwgJXAgREIgJXAiLAogICAgICAgICAgICAgcFRMQ2IsIHB2b3NEYXRhQnVmZikpOwogICAgaWYgKE5VTEwgIT0gcHZvc0RhdGFCdWZmKQogICAgewogICAgICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgfQogICAgaWYoTlVMTCAhPSBwVExDYikKICAgIHsKICAgICAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgICAgICB9CiAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjTm9Nb3JlRGF0YSA9IDE7CiAgICB9CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBwU3RhQ2xpZW50ID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwU3RhQ2xpZW50ICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICB2b3NfbWVtX3plcm8oJnRsTWV0YUluZm8sIHNpemVvZih0bE1ldGFJbmZvKSk7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZldGNoIHBhY2tldCBmcm9tIEhERAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBpZiAoKFdMQU5fU1RBX1NPRlRBUCAhPSBwU3RhQ2xpZW50LT53U1RBRGVzYy53U1RBVHlwZSkgJiYKICAgICAgKCF2b3NfY29uY3VycmVudF9vcGVuX3Nlc3Npb25zX3J1bm5pbmcoKSkgJiYKICAgICAgIXBUTENiLT51Y1RkbHNQZWVyQ291bnQpCiAgewojZWxzZQogIGlmICgoV0xBTl9TVEFfU09GVEFQICE9IHBTdGFDbGllbnQtPndTVEFEZXNjLndTVEFUeXBlKSAmJgogICAgICAoIXZvc19jb25jdXJyZW50X29wZW5fc2Vzc2lvbnNfcnVubmluZygpKSkKICB7CiNlbmRpZgogIHVjQUMgPSBwU3RhQ2xpZW50LT51Y0N1cnJlbnRBQzsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIERpc2FibGUgQUMgdGVtcG9yYXJ5IC0gaWYgc3VjY2Vzc2Z1bGwgcmV0cmlldmUgcmUtZW5hYmxlCiAgICAgIFRoZSBvcmRlciBpcyBqdXN0aWZpZWQgYmVjYXVzZSBvZiB0aGUgcG9zc2libGUgc2NlbmFyaW8KICAgICAgIC0gVEwgdHJ5ZXMgdG8gZmV0Y2ggcGFja2V0IGZvciBBQyBhbmQgaXQgcmV0dXJucyBOVUxMCiAgICAgICAtIFRMIGFuYWx5emVzIHRoZSBkYXRhIGl0IGhhcyByZWNlaXZlZCB0byBzZWUgaWYgdGhlcmUgYXJlCiAgICAgICBhbnkgbW9yZSBwa3RzIGF2YWlsYWJsZSBmb3IgQUMgLT4gaWYgbm90IFRMIHdpbGwgZGlzYWJsZSBBQwogICAgICAgLSBob3dldmVyIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2hpbGUgYW5hbHl6aW5nIHJlc3VsdHMgVEwgZ290CiAgICAgICBwcmVlbXB0ZWQgYnkgYSBwZW5kaW5nIGluZGljYXRpb24gd2hlcmUgdGhlIG1hc2sgd2FzIGFnYWluIHNldAogICAgICAgVEwgd2lsbCBub3QgY2hlY2sgYWdhaW4gYW5kIGFzIGEgcmVzdWx0IHdoZW4gaXQgcmVzdW1lcwogICAgICAgZXhlY3V0aW9uIGl0IHdpbGwgZGlzYWJsZSBBQwogICAgICAgVG8gcHJldmVudCB0aGlzIHRoZSBBQyB3aWxsIGJlIGRpc2FibGVkIGhlcmUgYW5kIGlmIHJldHJpZXZlCiAgICAgICBpcyBzdWNjZXNzZnVsbCBpdCB3aWxsIGJlIHJlLWVuYWJsZWQKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwU3RhQ2xpZW50LT5hdWNBQ01hc2tbcFN0YUNsaWVudC0+dWNDdXJyZW50QUNdID0gMDsgCgogIC8vIGRvbid0IHJlc2V0IGl0LCBhcyBvdGhlciBBQyBxdWV1ZXMgaW4gSEREIG1heSBoYXZlIHBhY2tldHMKICAvL3Zvc19hdG9taWNfc2V0X1U4KCAmcFN0YUNsaWVudC0+dWNQa3RQZW5kaW5nLCAwKTsKICB9CiAgZWxzZQogIHsKICAgIC8vc29mdGFwIGNhc2UKICAgIHVjQUMgPSBwVExDYi0+dUN1clNlcnZlZEFDOwogICAgcFN0YUNsaWVudC0+YXVjQUNNYXNrW3VjQUNdID0gMDsgCgogICAgLy92b3NfYXRvbWljX3NldF9VOCggJnBTdGFDbGllbnQtPnVjUGt0UGVuZGluZywgMCk7CiAgfQoKICBXTEFOX1RMX0FDX0FSUkFZXzJfTUFTSyggcFN0YUNsaWVudCwgdWNBQ01hc2ssIGkpOyAKICAgIC8qWW91IG1ha2UgYW4gaW5pdGlhbCBhc3N1bXB0aW9uIHRoYXQgSEREIGhhcyBubyBtb3JlIGRhdGEgYW5kIGlmIHRoZSAKICAgICAgYXNzdW1wdGlvbiB3YXMgd3JvbmcgeW91IHJlc2V0IHRoZSBmbGFncyB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZQogICAgIFRoaXMgd2lsbCBwcmV2ZW50IGZyb20gZXhwb3NpbmcgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIGNoZWNraW5nIHdpdGggSEREIAogICAgIGZvciBwYWNrZXRzIGFuZCBzZXR0aW5nIHRoZSBmbGFncyB0byBmYWxzZSovCiAgaWYgKCAwID09IHVjQUNNYXNrICkKICB7CiAgICB2b3NfYXRvbWljX3NldF9VOCggJnBTdGFDbGllbnQtPnVjUGt0UGVuZGluZywgMCk7CiAgICBwU3RhQ2xpZW50LT51Y05vTW9yZURhdGEgPSAxOwogIH0KCiAgaWYgKFdMQU5fU1RBX0lCU1MgPT0gcFN0YUNsaWVudC0+d1NUQURlc2Mud1NUQVR5cGUpCiAgICAgcHJldlN0YUlkID0gdWNTVEFJZDsKCiAgdm9zU3RhdHVzID0gcFN0YUNsaWVudC0+cGZuU1RBRmV0Y2hQa3QoIHB2b3NHQ3R4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNBQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b3NEYXRhQnVmZiwgJnRsTWV0YUluZm8gKTsKCgogIGlmICgoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSB8fCAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYgKSkKICB7CgogICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmV0Y2ggcGt0IGZyb20gSEREICVkIiwKICAgICAgICAgICAgICAgICAgIHZvc1N0YXR1cyk7CiAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgUmVzZXQgQUMgZm9yIHRoZSBzZXJ2aWNlZCBzdGF0aW9uIHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5IEFDCiAgICAgIC0+IGR1ZSB0byBubyBtb3JlIGRhdGEgYXQgdGhlIHN0YXRpb24KICAgICAgRXZlbiBpZiB0aGlzIEFDIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHN0YXRpb24sIGNvcnJlY3Rpb24gd2lsbCBiZQogICAgICBtYWRlIGluIHRoZSBtYWluIFRMIGxvb3AKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudEFDICAgICA9IFdMQU5UTF9BQ19WTzsKICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudFdlaWdodCA9IDA7CgogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qIEluIElCU1Mgb25seSBvbmUgcXVldWUgaXMgdXNlZCBmb3IgYWxsIHN0YUlEIGFuZCB0aGUgZmV0Y2hlZCBwYWNrZXQncwogICAqIHN0YUlEIG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBzdGFJRCBmb3IgIHdoaWNoIGRhdGEgd2FzIHBlbmRpbmcuCiAgICogU28gdXBkYXRlIHRoZSBwU3RhQ2xpZW50IGFuZCBkbyBzYW5pdHkgY2hlY2tzIGZvciB0aGUgbmV3IHBTdGFDbGllbnQuCiAgICovCiAgaWYgKChXTEFOX1NUQV9JQlNTID09IHBTdGFDbGllbnQtPndTVEFEZXNjLndTVEFUeXBlKSAmJiAocHJldlN0YUlkICE9IHVjU1RBSWQpKQogIHsKICAgICBwU3RhQ2xpZW50ID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CiAgICAgaWYgKE5VTEwgPT0gcFN0YUNsaWVudCkKICAgICB7CiAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6U3RhdGlvbiBpcyBudWxsICIpOwogICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICAgICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgIH0KICAgICBpZiAoKDAgPT0gcFN0YUNsaWVudC0+dWNFeGlzdHMpIHx8CiAgICAgICAgICAgICAgICAgIChXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQgIT0gcFN0YUNsaWVudC0+dGxTdGF0ZSkpCiAgICAgewogICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpTdGF0aW9uIG5vdCByZWdpc3RlcmVkIG9yIGNvbm5lY3RlZCBzdGF0ZSA9ICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhQ2xpZW50LT50bFN0YXRlKTsKICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogICAgIH0KICB9CiAgV0xBTlRMX1N0YXRIYW5kbGVUWEZyYW1lKHB2b3NHQ3R4LCB1Y1NUQUlkLCB2b3NEYXRhQnVmZiwgTlVMTCwgJnRsTWV0YUluZm8pOwoKICAvKlRoZXJlIGFyZSBzdGlsbCBwYWNrZXRzIGluIEhERCAtIHNldCBiYWNrIHRoZSBwZW5kaW5nIHBhY2tldHMgYW5kIAogICB0aGUgbm8gbW9yZSBkYXRhIGFzc3VtcHRpb24qLwogIHZvc19hdG9taWNfc2V0X1U4KCAmcFN0YUNsaWVudC0+dWNQa3RQZW5kaW5nLCAxKTsKICBwU3RhQ2xpZW50LT51Y05vTW9yZURhdGEgPSAwOwoKICBpZiAoV0xBTl9TVEFfU09GVEFQICE9IHBTdGFDbGllbnQtPndTVEFEZXNjLndTVEFUeXBlKQogIHsKICAvLyBkb24ndCBuZWVkIHRvIHNldCBpdCwgYXMgd2UgZG9uJ3QgcmVzZXQgaXQgaW4gdGhpcyBmdW5jdGlvbi4KICAvL3Zvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNQa3RQZW5kaW5nLCAxKTsKICB9CgojaWZkZWYgV0xBTl9QRVJGIAogICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfQkFMLCAKICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KTApOwojZW5kaWYgLypXTEFOX1BFUkYqLwoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBUSUQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIHVjVGlkICAgICA9IHRsTWV0YUluZm8udWNUSUQ7CgogIC8qTWFrZSBzdXJlIFRJRCBpcyB2YWxpZCovCiAgaWYgKCBXTEFOVExfVElEX0lOVkFMSUQodWNUaWQpKSAKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUSUQgc2VudCBpbiBtZXRhIGluZm8gJWQgLSBkZWZhdWx0aW5nIHRvIDAgKEJFKSIsIAogICAgICAgICAgICAgdWNUaWQpKTsKICAgICB1Y1RpZCA9IDA7IAogIH0KCiAgLypTYXZlIGZvciBVQVBTRCB0aW1lciBjb25zaWRlcmF0aW9uKi8KICBwU3RhQ2xpZW50LT51Y1NlcnZpY2VkQUMgPSB1Y0FDOyAKCiAgaWYgKCB1Y0FDID09IHBTdGFDbGllbnQtPnVjQ3VycmVudEFDICkgCiAgewogICAgcFN0YUNsaWVudC0+YXVjQUNNYXNrW3BTdGFDbGllbnQtPnVjQ3VycmVudEFDXSA9IDE7CiAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQtLTsKICB9CiAgZWxzZQogIHsKICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudEFDICAgICA9IHVjQUM7CiAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQgPSBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3VjQUNdIC0gMTsKCiAgICBwU3RhQ2xpZW50LT5hdWNBQ01hc2tbcFN0YUNsaWVudC0+dWNDdXJyZW50QUNdID0gMTsKCiAgfQoKICBpZiAoV0xBTl9TVEFfU09GVEFQICE9IHBTdGFDbGllbnQtPndTVEFEZXNjLndTVEFUeXBlKQogIHsKICBpZiAoIDAgPT0gcFN0YUNsaWVudC0+dWNDdXJyZW50V2VpZ2h0ICkgCiAgewogICAgV0xBTlRMX0FDRW51bVR5cGUgdGVtcEFDID0gdWNBQzsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgIENob29zZSBuZXh0IEFDIC0gISEhIG9wdGltaXplIG1lCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICB3aGlsZSAoIDAgIT0gdWNBQ01hc2sgKSAKICAgIHsKICAgICAgdWNOZXh0QUMgPSAoV0xBTlRMX0FDRW51bVR5cGUpKCggdGVtcEFDIC0gMSApICYgV0xBTlRMX01BU0tfQUMpOyAKICAgICAgaWYgKCAwICE9IHBTdGFDbGllbnQtPmF1Y0FDTWFza1t1Y05leHRBQ10gKQogICAgICB7CiAgICAgICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudEFDICAgICA9IHVjTmV4dEFDOwogICAgICAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQgPSBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3VjTmV4dEFDXTsKCiAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IENoYW5naW5nIHNlcnZpY2VkIEFDIHRvOiAlZCB3aXRoIFdlaWdodDogJWQiLAogICAgICAgICAgICAgICAgICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudEFDICwgCiAgICAgICAgICAgICAgICAgICAgcFN0YUNsaWVudC0+dWNDdXJyZW50V2VpZ2h0KSk7CiAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRlbXBBQyA9IHVjTmV4dEFDOwogICAgfQogIH0KICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpBdHRhY2hpbmcgQkQgaGVhZGVyIHRvIHBrdCBvbiBXTEFOVExfU1RBVHhBdXRoIikpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVHJhbnNsYXRlIDgwMi4zIGZyYW1lIHRvIDgwMi4xMQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggMCA9PSB0bE1ldGFJbmZvLnVjRGlzYWJsZUZybVh0bCApCiAgewogICAgIC8qIE5lZWRzIGZyYW1lIHRyYW5zbGF0aW9uICovCiAgICAgLy8gaWYgdGhlIGNsaWVudCBoYXMgbm90IGVuYWJsZWQgU1ctb25seSBmcmFtZSB0cmFuc2xhdGlvbgogICAgIC8vIGFuZCBpZiB0aGUgZnJhbWUgaXMgYSB1bmljYXN0IGZyYW1lCiAgICAgLy8gICAoSFcgZnJhbWUgdHJhbnNsYXRpb24gZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBicm9hZGNhc3QgZG9tYWlucwogICAgIC8vICAgIHNvIHdlIHVzZSBTVyBmcmFtZSB0cmFuc2xhdGlvbiBmb3IgYnJvYWRjYXN0L211bHRpY2FzdCBmcmFtZXMpCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogICAgIC8vIGFuZCBpZiB0aGUgZnJhbWUgaXMgbm90IGEgV0FQSSBmcmFtZQojZW5kaWYKICAgICAvLyB0aGVuIHVzZSBIV19iYXNlZCBmcmFtZSB0cmFuc2xhdGlvbgoKICAgICBpZiAoICggMCA9PSBwU3RhQ2xpZW50LT53U1RBRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24gKSAmJgogICAgICAgICAgKCAwID09IHRsTWV0YUluZm8udWNCY2FzdCApICYmCiAgICAgICAgICAoIDAgPT0gdGxNZXRhSW5mby51Y01jYXN0ICkKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgICAgICAgICAmJiAoIHRsTWV0YUluZm8udWNJc1dhaSAhPSAxICkKI2VuZGlmCiAgICAgICAgKQogICAgIHsKI2lmZGVmIFdMQU5fUEVSRiAKICAgICAgICB2X1UzMl90IHVGYXN0RndkT0sgPSAwOwoKICAgICAgICAvKiBIVyBiYXNlZCB0cmFuc2xhdGlvbi4gU2VlIGlmIHRoZSBmcmFtZSBjb3VsZCBiZSBmYXN0IGZvcndhcmRlZCAqLwogICAgICAgIFdEQV9UTElfRmFzdEh3RndkRGF0YUZyYW1lKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYgLCAmdm9zU3RhdHVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdUZhc3RGd2RPSywgJnRsTWV0YUluZm8sICZwU3RhQ2xpZW50LT53U1RBRGVzYyk7CgogICAgICAgIGlmKCBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzICkKICAgICAgICB7CiAgICAgICAgICAgIGlmKHVGYXN0RndkT0spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIFBhY2tldCBjb3VsZCBiZSBmYXN0IGZvcndhcmRlZCBub3cgKi8KICAgICAgICAgICAgICAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXBTdGFDbGllbnQtPnBmblNUQVR4Q29tcCApOwoKICAgICAgICAgICAgICAgICpwdm9zRGF0YUJ1ZmYgPSB2b3NEYXRhQnVmZjsKCiAgICAgICAgICAgICAgICAvKiBUT0RPOiBEbyB3ZSByZWFsbHkgbmVlZCB0byB1cGRhdGUgV0xBTlRMX0hTSGFuZGxlVFhGcmFtZSgpIAogICAgICAgICAgICAgICAgICAgc3RhdHMgZm9yIGV2ZXJ5IHBrdD8gKi8KICAgICAgICAgICAgICAgIHBTdGFDbGllbnQtPmF1VHhDb3VudFt0bE1ldGFJbmZvLnVjVElEXSsrOwogICAgICAgICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8qIGNhbid0IGJlIGZhc3QgZm9yd2FyZGVkLCBmYWxsIHRocm91Z2ggbm9ybWFsIChzbG93KSBwYXRoLiAqLwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewoKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGZhc3RGd2QgQkQgJWQiLCB2b3NTdGF0dXMpKTsKICAgICAgICAgICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgICAgfQojZW5kaWYgLypXTEFOX1BFUkYqLwogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgIC8qIFNXIGJhc2VkIHRyYW5zbGF0aW9uICovCgojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICAgICAgIGdVY0lzV2FpID0gdGxNZXRhSW5mby51Y0lzV2FpLAojZW5kaWYKCiAgICAgICB2b3NTdGF0dXMgPSAgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyKCB2b3NEYXRhQnVmZiwgJnZvc1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLCAmdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bE1ldGFJbmZvLCAmdWNXRFNFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dHJhSGVhZFNwYWNlKTsKICAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICAgICB7CiAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6RXJyb3Igd2hlbiB0cmFuc2xhdGluZyBoZWFkZXIgV0xBTlRMX1NUQVR4QXV0aCIpKTsKICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgICB9CgogICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICAgICJXTEFOIFRMIHNvZnR3YXJlIHRyYW5zbGF0aW9uIHN1Y2Nlc3MiKSk7CiAgICAgICB1Y1N3RnJtWHRsID0gMTsKICAgICAgIHRsTWV0YUluZm8udWNEaXNhYmxlRnJtWHRsID0gMTsKICAgIH0KICB9CiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogICAgLypJbiBjYXNlIG9mIFRETFMsIGlmIHRoZSBwYWNrZXQgaXMgZGVzdGluZWQgdG8gVERMUyBTVEEgdWNTVEFJZCBtYXkKICAgICAgY2hhbmdlLiBzbyB1cGRhdGUgdGhlIHBTdGFDbGllbnQgYWNjb3JkaW5nbHkgKi8KICAgIHBTdGFDbGllbnQgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgICBpZiAoIE5VTEwgPT0gcFN0YUNsaWVudCApCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJwU3RhQ2xpZW50IGlzIE5VTEwgJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgIH0KI2VuZGlmCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDYWxsIEhBTCB0byBmaWxsIEJEIGhlYWRlcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y1R5cGVTdWJ0eXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9UWVBFIDw8IDQpOwoKICBpZiAoIHBTdGFDbGllbnQtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCApIAogIHsKICAgIHVjVHlwZVN1YnR5cGUgfD0gKFdMQU5UTF84MDIxMV9EQVRBX1FPU19TVUJUWVBFKTsKICB9CgogIHVjVHhGbGFnICA9ICgwICE9IHBTdGFDbGllbnQtPndVQVBTREluZm9bdWNBQ10udWNTZXQpPwogICAgICAgICAgICAgIEhBTF9UUklHR0VSX0VOQUJMRURfQUNfTUFTSzowOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgaWYgKCBwU3RhQ2xpZW50LT53U1RBRGVzYy51Y0lzV2FwaVN0YSA9PSAxICkKICB7CiNpZmRlZiBMSUJSQV9XQVBJX1NVUFBPUlQKICAgIHVjVHhGbGFnID0gdWNUeEZsYWcgfCBIQUxfV0FQSV9TVEFfTUFTSzsKI2VuZGlmIC8vTElCUkFfV0FQSV9TVVBQT1JUCiAgICBpZiAoIHRsTWV0YUluZm8udWNJc1dhaSA9PSAxICkgCiAgICB7CiAgICAgIHVjVHhGbGFnID0gdWNUeEZsYWcgfCBIQUxfVFhfTk9fRU5DUllQVElPTl9NQVNLOwogICAgfQogIH0KI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIGlmICggcFN0YUNsaWVudC0+d1NUQURlc2Mud1NUQVR5cGUgPT0gV0xBTl9TVEFfVERMUyApCiAgewogICAgdWNUeEZsYWcgPSB1Y1R4RmxhZyB8IEhBTF9URExTX1BFRVJfU1RBX01BU0s7CiAgfQojZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KICBpZiggdGxNZXRhSW5mby51Y0lzQXJwICkKICB7CiAgICAvKlNlbmQgQVJQIGF0IGxvd2VzdCBQaHkgcmF0ZSBhbmQgdGhyb3VnaCBXUTUgKi8KICAgIHVjVHhGbGFnIHw9IEhBTF9VU0VfQkRfUkFURV9NQVNLOwogIH0KCiAgdm9zU3RhdHVzID0gKFZPU19TVEFUVVMpV0RBX0RTX0J1aWxkVHhQYWNrZXRJbmZvKCBwdm9zR0N0eCwgCiAgICAgICAgICAgICAgICAgICAgIHZvc0RhdGFCdWZmICwgJnZEZXN0TWFjQWRkciwKICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwsICZ1c1BrdExlbiwKICAgICAgICAgICAgICAgICAgICAgcFN0YUNsaWVudC0+d1NUQURlc2MudWNRb3NFbmFibGVkLCB1Y1dEU0VuYWJsZWQsIAogICAgICAgICAgICAgICAgICAgICBleHRyYUhlYWRTcGFjZSwKICAgICAgICAgICAgICAgICAgICAgdWNUeXBlU3VidHlwZSwgJnBTdGFDbGllbnQtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgdWNUaWQsIHVjVHhGbGFnLCB0bE1ldGFJbmZvLnVzVGltZVN0YW1wLCAKICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51Y0lzRWFwb2wsIHRsTWV0YUluZm8udWNVUCApOwoKICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIkZpbGwgVFggQkQgRXJyb3Igc3RhdHVzICVkIiwgdm9zU3RhdHVzKSk7CgogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qIFRYIFN0YXRpc3RpY3MgKi8KICBpZiAoISh0bE1ldGFJbmZvLnVjQmNhc3QgfHwgdGxNZXRhSW5mby51Y01jYXN0KSkKICB7CiAgICAvKiBUaGlzIGlzIFRYIFVDIGZyYW1lICovCiAgICBwU3RhQ2xpZW50LT50cmFmZmljU3RhdGlzdGljcy50eFVDRmNudCsrOwogICAgcFN0YUNsaWVudC0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0JjbnQgKz0gdXNQa3RMZW47CiAgfQoKI2lmbmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFVwZGF0ZSB0eCBjb3VudGVyIGZvciBCQSBzZXNzaW9uIHF1ZXJ5IGZvciB0eCBzaWRlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFN0YUNsaWVudC0+YXVUeENvdW50W3VjVGlkXSsrOwojZWxzZQogIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5hdVR4Q291bnRbdWNUaWRdKys7CiNlbmRpZgoKICAvKiBUaGlzIGNvZGUgaXMgdG8gc2VuZCB0cmFmZmljIHdpdGggbG93ZXIgcHJpb3JpdHkgQUMgd2hlbiB3ZSBkb2VzIG5vdCAKICAgICBnZXQgYWRtaXR0ZWQgdG8gc2VuZCBpdC4gVG9kYXkgSEFMIGRvZXMgbm90IGRvd25ncmFkZSBBQyBzbyB0aGlzIGNvZGUgCiAgICAgZG9lcyBub3QgZ2V0IGV4ZWN1dGVkLihJbiBvdGhlciB3b3JkcywgSEFMIGRvZXNuknQgY2hhbmdlIHRpZC4gVGhlIGlmIAogICAgIHN0YXRlbWVudCBpcyBhbHdheXMgZmFsc2UuKQogICAgIE5PVEU6IEluIHRoZSBjYXNlIG9mIExBIGRvd25ncmFkZSBvY2N1cnMgaW4gSEREICh0aGF0IHdhcyB0aGUgY2hhbmdlIAogICAgIFBoYW5pIG1hZGUgZHVyaW5nIFdNTS1BQyBwbHVnZmVzdCkuIElmIFdNICYgQk1QIGFsc28gdG9vayB0aGlzIGFwcHJvYWNoLCAKICAgICB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gbmVlZCBmb3IgYW55IEFDIGRvd25ncmFkZSBsb2dpYyBpbiBUTC9XREkuICAgKi8KI2lmIDAKICBpZiAoKCB1Y1RpZCAhPSB0bE1ldGFJbmZvLnVjVElEICkgJiYKICAgICAgKCAwICE9IHBTdGFDbGllbnQtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCApICYmIAogICAgICAoIDAgIT0gdWNTd0ZybVh0bCApKQogIHsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICEhIEZJWCBtZTogT25jZSBkb3duZ3JhZGluZyBpcyBjbGVhciBwdXQgaW4gdGhlIHByb3BlciBjaGFuZ2UKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICB1Y1FDT2Zmc2V0ID0gV0xBTkhBTF9UWF9CRF9IRUFERVJfU0laRSArIFdMQU5UTF84MDJfMTFfSEVBREVSX0xFTjsKCiAgICAvLyEhIUZpeCB0aGlzIHJlcGxhY2UgcGVlayB3aXRoIGV4dHJhY3QgCiAgICB2b3NfcGt0X3BlZWtfZGF0YSggdm9zRGF0YUJ1ZmYsIHVjUUNPZmZzZXQsKHZfUFZPSURfdCkmcHVjUW9zQ3RybCwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnB1Y1Fvc0N0cmwpKTsKICAgICpwdWNRb3NDdHJsID0gdWNUaWQ7IC8vPyBwcm9wZXIgYnl0ZSBvcmRlcgogIH0KI2VuZGlmCgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBmaWxsIEJEICVkIiwgdm9zU3RhdHVzKSk7CiAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXBTdGFDbGllbnQtPnBmblNUQVR4Q29tcCApOwoKICAqcHZvc0RhdGFCdWZmID0gdm9zRGF0YUJ1ZmY7CgogIC8qQkUgJiBCSyBjYW4gYmUgZGVsYXllZCwgVk8gYW5kIFZJIG5vdCBmcmFtZXMgY2Fubm90IGJlIGRlbGF5ZWQqLwogIGlmICggcFN0YUNsaWVudC0+dWNTZXJ2aWNlZEFDID4gV0xBTlRMX0FDX0JFICkgCiAgewogICAgcFRMQ2ItPmJVcmdlbnQ9IFRSVUU7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVR4QXV0aCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFUeERpc2MKCiAgREVTQ1JJUFRJT04KICAgIFRyYW5zbWl0IGluIGRpc2Nvbm5lY3RlZCBzdGF0ZSAtIG5vIGRhdGEgYWxsb3dlZAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHR4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBVHhEaXNjCigKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZiwKICB2X0JPT0xfdCAgICAgIGJGb3J3YXJkSUFQUHdpdGhMTEMKKQp7CiAgIFdMQU5UTF9DYlR5cGUqICAgICAgICBwVExDYiAgICAgICA9IE5VTEw7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TVEFUeEF1dGgiKSk7CiAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXJyb3IKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgIldMQU4gVEw6UGFja2V0IHNob3VsZCBub3QgYmUgdHJhbnNtaXR0ZWQgaW4gc3RhdGUgZGlzY29ubmVjdGVkIGlnbm9yaW5nIgogICAgICAgICAgICAiIHJlcXVlc3QiKSk7CgogICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICBwQ2xpZW50U1RBLT51Y05vTW9yZURhdGEgPSAxOwogICAKICAgLy9TaG91bGQgbm90IGJlIGFueXRoaW5nIHBlbmRpbmcgaW4gZGlzY29ubmVjdCBzdGF0ZQogICB2b3NfYXRvbWljX3NldF9VOCggJnBDbGllbnRTVEEtPnVjUGt0UGVuZGluZywgMCk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU1RBVHhEaXNjICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVJ4Q29ubgoKICBERVNDUklQVElPTgogICAgUmVjZWl2ZSBpbiBjb25uZWN0ZWQgc3RhdGUgLSBvbmx5IEVBUE9MCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFNUQSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgdHgvcnggdm9zIGJ1ZmZlcgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TVEFSeENvbm4KKAogIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICB1Y1NUQUlkLAogIHZvc19wa3RfdCoqICAgcHZvc0RhdGFCdWZmLAogIHZfQk9PTF90ICAgICAgYkZvcndhcmRJQVBQd2l0aExMQwopCnsKICAgV0xBTlRMX0NiVHlwZSogICAgICAgICAgIHBUTENiID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgIHBDbGllbnRTVEEgPSBOVUxMOwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNFdGhlclR5cGUgPSAwOwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNQa3RMZW47CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y01QRFVIT2Zmc2V0OwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNNUERVRE9mZnNldDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzTVBEVUxlbjsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW47CiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c0FjdHVhbEhMZW4gPSAwOwogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgdm9zX3BrdF90KiAgICAgICAgICAgICAgIHZvc0RhdGFCdWZmOwogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgYXVjQkRIZWFkZXI7CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y1RpZDsKICAgV0xBTlRMX1J4TWV0YUluZm9UeXBlICAgIHdSeE1ldGFJbmZvOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggTlVMTCA9PSBwdm9zRGF0YUJ1ZmYgKSB8fCAoIE5VTEwgPT0gKCB2b3NEYXRhQnVmZiA9ICpwdm9zRGF0YUJ1ZmYgKSkpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9TVEFSeENvbm4iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgQkQgaGVhZGVyIGFuZCBjaGVjayBpZiB2YWxpZAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc1N0YXR1cyA9IFdEQV9EU19QZWVrUnhQYWNrZXRJbmZvKCB2b3NEYXRhQnVmZiwgKHZfUFZPSURfdCkmYXVjQkRIZWFkZXIsIDAvKlN3YXAgQkQqLyApOwoKICBpZiAoIE5VTEwgPT0gYXVjQkRIZWFkZXIgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6Q2Fubm90IGV4dHJhY3QgQkQgaGVhZGVyIikpOwogICAgVk9TX0FTU0VSVCggMCApOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgoKICB1Y01QRFVIT2Zmc2V0ID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfSEVBREVSX09GRlNFVChhdWNCREhlYWRlcik7CiAgdXNNUERVRE9mZnNldCA9ICh2X1UxNl90KVdEQV9HRVRfUlhfTVBEVV9EQVRBX09GRlNFVChhdWNCREhlYWRlcik7CiAgdXNNUERVTGVuICAgICA9ICh2X1UxNl90KVdEQV9HRVRfUlhfTVBEVV9MRU4oYXVjQkRIZWFkZXIpOwogIHVjTVBEVUhMZW4gICAgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfTEVOKGF1Y0JESGVhZGVyKTsKICB1Y1RpZCAgICAgICAgID0gKHZfVThfdClXREFfR0VUX1JYX1RJRChhdWNCREhlYWRlcik7CgogIHZvc19wa3RfZ2V0X3BhY2tldF9sZW5ndGgoIHZvc0RhdGFCdWZmLCAmdXNQa3RMZW4pOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIHByb2Nlc3NpbmcgZGF0YTogSE8gJWQgRE8gJWQgTGVuICVkIEhMZW4gJWQiLAogICAgICAgICAgICAgdWNNUERVSE9mZnNldCwgdXNNUERVRE9mZnNldCwgdXNNUERVTGVuLCB1Y01QRFVITGVuKSk7CgogICAgLypJdCB3aWxsIGN1dCBvdXQgdGhlIDgwMi4xMSBoZWFkZXIgaWYgbm90IHVzZWQqLwogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IFdEQV9EU19UcmltUnhQYWNrZXRJbmZvKCB2b3NEYXRhQnVmZiApICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpCRCBoZWFkZXIgY29ycnVwdGVkIC0gZHJvcHBpbmcgcGFja2V0IikpOwogICAgLyogRHJvcCBwYWNrZXQgKi8KICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogIH0KCiAgdm9zU3RhdHVzID0gV0xBTlRMX0dldEV0aGVyVHlwZShhdWNCREhlYWRlcix2b3NEYXRhQnVmZix1Y01QRFVITGVuLCZ1c0V0aGVyVHlwZSk7CiAgCiAgaWYoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpICkKICB7CiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogICAgLyogSWYgZnJhbWUgaXMgbmVpdGhlciBhbiBFQVBPTCBmcmFtZSBub3IgYSBXQUkgZnJhbWUgdGhlbiB3ZSBkcm9wIHRoZSBmcmFtZSovCiAgICAvKiBUT0RPOiBEbyB3ZSBuZWVkIGEgY2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiBXQVBJIG1vZGU/IElmIG5vdCBpcyBpdCBwb3NzaWJsZSAqLwogICAgLyogdGhhdCB3ZSBnZXQgYW4gRUFQT0wgcGFja2V0IGluIFdBUEkgbW9kZSBvciB2aWNlIHZlcnNhPyAqLwogICAgaWYgKCBXTEFOVExfTExDXzgwMjFYX1RZUEUgICE9IHVzRXRoZXJUeXBlICYmIFdMQU5UTF9MTENfV0FJX1RZUEUgICE9IHVzRXRoZXJUeXBlICkKICAgIHsKICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpSWCBGcmFtZSBub3QgRUFQT0wgb3IgV0FJIEV0aGVyVHlwZSAlZCAtIGRyb3BwaW5nIiwgdXNFdGhlclR5cGUgKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgIH0KI2Vsc2UKICAgIGlmICggV0xBTlRMX0xMQ184MDIxWF9UWVBFICAhPSB1c0V0aGVyVHlwZSApCiAgICB7CiAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOlJYIEZyYW1lIG5vdCBFQVBPTCBFdGhlclR5cGUgJWQgLSBkcm9wcGluZyIsIHVzRXRoZXJUeXBlKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgIH0KI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCiAgICBlbHNlIC8qIEZyYW1lIGlzIGFuIEVBUE9MIGZyYW1lIG9yIGEgV0FJIGZyYW1lKi8gIAogICAgewogICAgICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsCiAgICAgICAgICAgICAgICAgICBUUkFDRV9DT0RFX1RMX1JYX0NPTk5fRUFQT0wsIHVjU1RBSWQsIHVzRXRoZXJUeXBlICkpOwoKICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpSWCBGcmFtZSAgRUFQT0wgRXRoZXJUeXBlICVkIC0gcHJvY2Vzc2luZyIsIHVzRXRoZXJUeXBlKTsKCiAgICAgIGlmICgoIDAgPT0gV0RBX0dFVF9SWF9GVF9ET05FKGF1Y0JESGVhZGVyKSApICYmCiAgICAgICAgICggMCAhPSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1N3RnJhbWVSWFhsYXRpb24pKQogICAgICB7CiAgICAgIGlmICh1c01QRFVET2Zmc2V0ID4gdWNNUERVSE9mZnNldCkKICAgICAgewogICAgICAgICB1c0FjdHVhbEhMZW4gPSB1c01QRFVET2Zmc2V0IC0gdWNNUERVSE9mZnNldDsKICAgICAgfQoKICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX1RyYW5zbGF0ZTgwMjExVG84MDIzSGVhZGVyKCB2b3NEYXRhQnVmZiwgJnZvc1N0YXR1cywgdXNBY3R1YWxITGVuLCAKICAgICAgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW4sIHBUTENiLCB1Y1NUQUlkLCBiRm9yd2FyZElBUFB3aXRoTExDKTsKCiAgICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkgCiAgICAgICAgewogICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB0byB0cmFuc2xhdGUgZnJvbSA4MDIuMTEgdG8gODAyLjMgLSBkcm9wcGluZyIpKTsKICAgICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIEluY3JlbWVudCByZWNlaXZlIGNvdW50ZXIKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIGlmICggIVdMQU5UTF9USURfSU5WQUxJRCggdWNUaWQpICkgCiAgICAgIHsKICAgICAgICBwQ2xpZW50U1RBLT5hdVJ4Q291bnRbdWNUaWRdKys7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHRpZCAgJWQgKFN0YXRpb24gSUQgJWQpIG9uICVzIiwKICAgICAgICAgICAgICAgdWNUaWQsIHVjU1RBSWQsIF9fZnVuY19fKSk7CiAgICAgIH0KCiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOlNlbmRpbmcgRUFQb0wgZnJhbWUgdG8gc3RhdGlvbiAlZCBBQyAlZCIsIHVjU1RBSWQsIHVjVGlkKSk7CgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgISEhQXNzdW1pbmcgVElEID0gVVAgbWFwcGluZyAKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIHdSeE1ldGFJbmZvLnVjVVAgPSB1Y1RpZDsKCiAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgIldMQU4gVEwgJXM6U2VuZGluZyBkYXRhIGNoYWluIHRvIHN0YXRpb24iLCBfX2Z1bmNfXykpOwogICAgICBpZiAoIFdMQU5fU1RBX1NPRlRBUCA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSApCiAgICAgIHsKICAgICAgICB3UnhNZXRhSW5mby51Y0Rlc1NUQUlkID0gV0xBTl9SWF9TQVBfU0VMRl9TVEFfSUQ7CiAgICAgICAgcENsaWVudFNUQS0+cGZuU1RBUngoIHB2b3NHQ3R4LCB2b3NEYXRhQnVmZiwgdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd1J4TWV0YUluZm8gKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHBDbGllbnRTVEEtPnBmblNUQVJ4KCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndSeE1ldGFJbmZvICk7CiAgICB9LypFQVBPTCBmcmFtZSBvciBXQUkgZnJhbWUqLwogIH0vKnZvcyBzdGF0dXMgc3VjY2VzcyovCgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU1RBUnhDb25uICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX0Z3ZFBrdFRvSERECgogIERFU0NSSVBUSU9OCiAgICBEZXRlcm1pbmUgdGhlIERlc3RhdGlvbiBTdGF0aW9uIElEIGFuZCByb3V0ZSB0aGUgRnJhbWUgdG8gVXBwZXIgTGF5ZXIKCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGJlaW5nIHByb2Nlc3NlZAogICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSByeCB2b3MgYnVmZmVyCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpWT1NfU1RBVFVTCldMQU5UTF9Gd2RQa3RUb0hERAooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCogICAgIHB2b3NEYXRhQnVmZiwKICB2X1U4X3QgICAgICAgICAgdWNTVEFJZAopCnsKICAgdl9NQUNBRERSX3QgICAgICAgICAgICAgIERlc3RNYWNBZGRyZXNzOwogICB2X01BQ0FERFJfdCAgICAgICAgICAgICAgKnBEZXN0TWFjQWRkcmVzcyA9ICZEZXN0TWFjQWRkcmVzczsKICAgdl9TSVpFX3QgICAgICAgICAgICAgICAgIHVzTWFjQWRkU2l6ZSA9IFZPU19NQUNfQUREUl9TSVpFOwogICBXTEFOVExfQ2JUeXBlKiAgICAgICAgICAgcFRMQ2IgPSBOVUxMOwogICBXTEFOVExfU1RBQ2xpZW50VHlwZSogICAgcENsaWVudFNUQSA9IE5VTEw7CiAgIHZvc19wa3RfdCogICAgICAgICAgICAgICB2b3NEYXRhQnVmZiA7CiAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgIHZfVTMyX3QqICAgICAgICAgICAgICAgICBTVEFNZXRhSW5mb1B0cjsKICAgdm9zX3BrdF90KiAgICAgICAgICAgICAgIHZvc05leHREYXRhQnVmZiA7CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y0Rlc1NUQUlkOwogICBXTEFOVExfUnhNZXRhSW5mb1R5cGUgICAgd1J4TWV0YUluZm87CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoKCBOVUxMID09IHB2b3NEYXRhQnVmZiApIHx8ICggTlVMTCA9PSAoIHZvc0RhdGFCdWZmID0gcHZvc0RhdGFCdWZmICkpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9Gd2RQa3RUb0hkZCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfRndkUGt0VG9IZGQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYoV0xBTlRMX1NUQV9JRF9JTlZBTElEKHVjU1RBSWQpKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwidWNTVEFJZCAlZCBpcyBub3QgdmFsaWQiLAogICAgICAgICAgICAgICAgIHVjU1RBSWQpKTsKICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgIC8qIFRoaXMgdGhlIGNoYW5nZSByZXF1aXJlZCBmb3IgU29mdEFwIHRvIGhhbmRsZSBSZW9yZGVyZWQgQnVmZmVyLiBTaW5jZSBhIFNUQQogICAgICBtYXkgaGF2ZSBwYWNrZXRzIGRlc3RpbmVkIHRvIG11bHRpcGxlIGRlc3RpbmF0aW9ucyB3ZSBoYXZlIHRvIHByb2Nlc3MgZWFjaCBwYWNrZXQKICAgICAgYXQgYSB0aW1lIGFuZCBkZXRlcm1pbmUgaXRzIERlc3RpbmF0aW9uLiBTbyB0aGUgVm9zY2hhaW4gcHJvdmlkZWQgYnkgUmVvcmRlciBjb2RlCiAgICAgIGlzIHVuY2hhaW4gYW5kIGZvcndhcmRlZCB0byBVcHBlciBMYXllciBhZnRlciBEZXRlcm1pbmluZyB0aGUgRGVzdGluYXRpb24gKi8KCiAgIHZvc0RhdGFCdWZmID0gcHZvc0RhdGFCdWZmOwogICB3aGlsZSAodm9zRGF0YUJ1ZmYgIT0gTlVMTCkKICAgewogICAgICB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCB2b3NEYXRhQnVmZiwgJnZvc05leHREYXRhQnVmZiwgMS8qdHJ1ZSovICk7CiAgICAgIHZvc19wa3RfZ2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCAqKSZTVEFNZXRhSW5mb1B0ciApOwogICAgICB3UnhNZXRhSW5mby51Y1VQID0gKHZfVThfdCkoKHVpbnRwdHJfdClTVEFNZXRhSW5mb1B0ciAmIFdMQU5UTF9BQ19NQVNLKTsKICAgICAgdWNEZXNTVEFJZCA9ICh2X1U4X3QpKCgodWludHB0cl90KVNUQU1ldGFJbmZvUHRyKSA+PiBXTEFOVExfU1RBSURfT0ZGU0VUKTsKICAgICAgIAogICAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X2V4dHJhY3RfZGF0YSggdm9zRGF0YUJ1ZmYsIDAsICh2X1ZPSURfdCAqKXBEZXN0TWFjQWRkcmVzcywgJnVzTWFjQWRkU2l6ZSk7CiAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICAgIHsKICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6IHJlY3YgY29ycnVwdGVkIGRhdGEgcGFja2V0IikpOwogICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgICB9CgogICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0aW9uIG1hYyAiTUFDX0FERFJFU1NfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICBNQUNfQUREUl9BUlJBWShwRGVzdE1hY0FkZHJlc3MtPmJ5dGVzKSkpOwoKICAgICAgaWYgKHZvc19pc19tYWNhZGRyX2Jyb2FkY2FzdCggcERlc3RNYWNBZGRyZXNzICkgfHwgdm9zX2lzX21hY2FkZHJfZ3JvdXAocERlc3RNYWNBZGRyZXNzKSkKICAgICAgewogICAgICAgICAgLy8gZGVzdGluYXRpb24gaXMgbWMvYmMgc3RhdGlvbgogICAgICAgICAgdWNEZXNTVEFJZCA9IFdMQU5fUlhfQkNNQ19TVEFfSUQ7CiAgICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgICAiJXM6IEJDL01DIHBhY2tldCwgaWQgJWQiLCBfX2Z1bmNfXywgV0xBTl9SWF9CQ01DX1NUQV9JRCkpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICBpZiAodm9zX2lzX21hY2FkZHJfZXF1YWwocERlc3RNYWNBZGRyZXNzLCAmcENsaWVudFNUQS0+d1NUQURlc2MudlNlbGZNQUNBZGRyZXNzKSkKICAgICAgICAgewogICAgICAgICAgICAvLyBkZXN0aW5hdGlvbiBpcyBBUCBpdHNlbGYKICAgICAgICAgICAgdWNEZXNTVEFJZCA9IFdMQU5fUlhfU0FQX1NFTEZfU1RBX0lEOwogICAgICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgICAgIiVzOiBwYWNrZXQgdG8gQVAgaXRzZWxmLCBpZCAlZCIsIF9fZnVuY19fLCBXTEFOX1JYX1NBUF9TRUxGX1NUQV9JRCkpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKCggV0xBTl9NQVhfU1RBX0NPVU5UIDw9IHVjRGVzU1RBSWQgKSB8fCAoTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0Rlc1NUQUlkXSAmJiBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0Rlc1NUQUlkXS0+dWNFeGlzdHMgPT0gMCkpCiAgICAgICAgIHsKICAgICAgICAgICAgLy8gZGVzdGluYXRpb24gc3RhdGlvbiBpcyBzb21ldGhpbmcgZWxzZQogICAgICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAiJXM6IGdldCBhbiBzdGF0aW9uIGluZGV4IGxhcmdlciB0aGFuIFdMQU5fTUFYX1NUQV9DT1VOVCAlZCIsIF9fZnVuY19fLCB1Y0Rlc1NUQUlkKSk7CiAgICAgICAgICAgIHVjRGVzU1RBSWQgPSBXTEFOX1JYX1NBUF9TRUxGX1NUQV9JRDsKICAgICAgICAgfQoKICAgICAgICAgCiAgICAgICAgIC8vbG9vcGJhY2sgdW5pY2FzdCBzdGF0aW9uIGNvbWVzIGhlcmUKICAgICAgfQoKICAgICAgd1J4TWV0YUluZm8udWNVUCA9ICh2X1U4X3QpKCh1aW50cHRyX3QpU1RBTWV0YUluZm9QdHIgJiBXTEFOVExfQUNfTUFTSyk7CiAgICAgIHdSeE1ldGFJbmZvLnVjRGVzU1RBSWQgPSB1Y0Rlc1NUQUlkOwogICAgIAogICAgICB2b3NTdGF0dXMgPSBwQ2xpZW50U1RBLT5wZm5TVEFSeCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLCB1Y0Rlc1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3UnhNZXRhSW5mbyApOwogICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgICB7CiAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDogZmFpbGVkIHRvIHNlbmQgcGt0IHRvIEhERCIpKTsKICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CgogICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICAgfQogICAgICB2b3NEYXRhQnVmZiA9IHZvc05leHREYXRhQnVmZjsKICAgfQogICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVJ4QXV0aAoKICBERVNDUklQVElPTgogICAgUmVjZWl2ZSBpbiBhdXRoZW50aWNhdGVkIHN0YXRlIC0gYWxsIGRhdGEgYWxsb3dlZAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHJ4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBUnhBdXRoCigKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZiwKICB2X0JPT0xfdCAgICAgIGJGb3J3YXJkSUFQUHdpdGhMTEMKKQp7CiAgIFdMQU5UTF9DYlR5cGUqICAgICAgICAgICBwVExDYiA9IE5VTEw7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgICBwQ2xpZW50U1RBID0gTlVMTDsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjQXNmOyAvKiBBTVNEVSBzdWIgZnJhbWUgKi8KICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzTVBEVURPZmZzZXQ7CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y01QRFVIT2Zmc2V0OwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNNUERVTGVuOwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNNUERVSExlbjsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzQWN0dWFsSExlbiA9IDA7ICAgCiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y1RpZDsKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c0V0aGVyVHlwZSA9IDA7CiNlbmRpZgogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNQa3RMZW47CiAgIHZvc19wa3RfdCogICAgICAgICAgICAgICB2b3NEYXRhQnVmZiA7CiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICBhdWNCREhlYWRlcjsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgIHZvc1N0YXR1czsKICAgV0xBTlRMX1J4TWV0YUluZm9UeXBlICAgIHdSeE1ldGFJbmZvOwogICBzdGF0aWMgdl9VOF90ICAgICAgICAgICAgdWNQTVBEVUhMZW47CiAgIHZfVTMyX3QqICAgICAgICAgICAgICAgICBTVEFNZXRhSW5mb1B0cjsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjRXNmPTA7IC8qIGZpcnN0IHN1YmZyYW1lIG9mIEFNU0RVIGZsYWcgKi8KICAgdl9VNjRfdCAgICAgICAgICAgICAgICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyPTA7IC8qY3VycmVudCByZXBsYXkgY291bnRlciovCiAgIHZfVTY0X3QgICAgICAgICAgICAgICAgICB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXI9MDsgLypwcmV2aW91cyByZXBsYXkgY291bnRlciovCiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1Y1VuaWNhc3RCcm9hZGNhc3RUeXBlPTA7IC8qSXQgZGVub3RlcyB3aGV0aGVyIHJlY2VpdmVkIGZyYW1lIGlzIFVDIG9yIEJDKi8KICAgc3RydWN0IF9CQVJGcm1TdHJ1Y3QgICAgICpwQmFyRnJhbWUgPSBOVUxMOwoKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkgfHwgKCBOVUxMID09ICggdm9zRGF0YUJ1ZmYgPSAqcHZvc0RhdGFCdWZmICkpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9TVEFSeEF1dGgiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1NUQVJ4QXV0aCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IEJEIGhlYWRlciBhbmQgY2hlY2sgaWYgdmFsaWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBXREFfRFNfUGVla1J4UGFja2V0SW5mbyggdm9zRGF0YUJ1ZmYsICh2X1BWT0lEX3QpJmF1Y0JESGVhZGVyLCAwICk7CgogIHVjTVBEVUhPZmZzZXQgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfT0ZGU0VUKGF1Y0JESGVhZGVyKTsKICB1c01QRFVET2Zmc2V0ID0gKHZfVTE2X3QpV0RBX0dFVF9SWF9NUERVX0RBVEFfT0ZGU0VUKGF1Y0JESGVhZGVyKTsKICB1c01QRFVMZW4gICAgID0gKHZfVTE2X3QpV0RBX0dFVF9SWF9NUERVX0xFTihhdWNCREhlYWRlcik7CiAgdWNNUERVSExlbiAgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4oYXVjQkRIZWFkZXIpOwogIHVjVGlkICAgICAgICAgPSAodl9VOF90KVdEQV9HRVRfUlhfVElEKGF1Y0JESGVhZGVyKTsKCiAgLyogRml4IGZvciBhIGhhcmR3YXJlIGJ1Zy4gCiAgICogSC9XIGRvZXMgbm90IHVwZGF0ZSB0aGUgdGlkIGZpZWxkIGluIEJEIGhlYWRlciBmb3IgQkFSIGZyYW1lcy4KICAgKiBGaXggaXMgdG8gcmVhZCB0aGUgdGlkIGZpZWxkIGZyb20gTUFDIGhlYWRlciBvZiBCQVIgZnJhbWUgKi8KICBpZiggKFdEQV9HRVRfUlhfVFlQRShhdWNCREhlYWRlcikgPT0gU0lSX01BQ19DVFJMX0ZSQU1FKSAmJgogICAgICAoV0RBX0dFVF9SWF9TVUJUWVBFKGF1Y0JESGVhZGVyKSA9PSBTSVJfTUFDX0NUUkxfQkFSKSkKICB7CiAgICAgIHBCYXJGcmFtZSA9IChzdHJ1Y3QgX0JBUkZybVN0cnVjdCAqKShXREFfR0VUX1JYX01BQ19IRUFERVIoYXVjQkRIZWFkZXIpKTsKICAgICAgdWNUaWQgPSBwQmFyRnJhbWUtPmJhckNvbnRyb2wubnVtVElEOwogIH0KCiAgLypIb3N0IGJhc2VkIHJlcGxheSBjaGVjayBpcyBuZWVkZWQgZm9yIHVuaWNhc3QgZGF0YSBmcmFtZXMqLwogIHVjVW5pY2FzdEJyb2FkY2FzdFR5cGUgID0gKHZfVTE2X3QpV0RBX0lTX1JYX0JDQVNUKGF1Y0JESGVhZGVyKTsKICBpZigwICE9IHVjTVBEVUhMZW4pCiAgewogICAgdWNQTVBEVUhMZW4gPSB1Y01QRFVITGVuOwogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciBwcm9jZXNzaW5nIGRhdGE6IEhPICVkIERPICVkIExlbiAlZCBITGVuICVkIgogICAgICAgICAgICAgIiBUaWQgJWQgQkQgJWQiLAogICAgICAgICAgICAgdWNNUERVSE9mZnNldCwgdXNNUERVRE9mZnNldCwgdXNNUERVTGVuLCB1Y01QRFVITGVuLCB1Y1RpZCwKICAgICAgICAgICAgIFdMQU5IQUxfUlhfQkRfSEVBREVSX1NJWkUpKTsKCiAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCggdm9zRGF0YUJ1ZmYsICZ1c1BrdExlbik7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IFdEQV9EU19UcmltUnhQYWNrZXRJbmZvKCB2b3NEYXRhQnVmZiApICkKICB7CiAgICBpZigoV0RBX0dFVF9SWF9BU0YoYXVjQkRIZWFkZXIpICYmICFXREFfR0VUX1JYX0VTRihhdWNCREhlYWRlcikpKQogIHsKICAgIC8qIEFNU0RVIGNhc2UsIHVjTVBEVUhPZmZzZXQgPSAwCiAgICAgKiBpdCBzaG91bGQgYmUgaGFuY2RsZWQgc2VwZXJhdGx5ICovCiAgICBpZigoIHVzTVBEVURPZmZzZXQgPiAgdWNNUERVSE9mZnNldCApICYmCiAgICAgICAoIHVzTVBEVUxlbiAgICAgPj0gdWNNUERVSExlbiApICYmICggdXNQa3RMZW4gPj0gdXNNUERVTGVuICkgJiYKICAgICAgICggIVdMQU5UTF9USURfSU5WQUxJRCh1Y1RpZCkgKSkKICAgIHsKICAgICAgICB1Y01QRFVIT2Zmc2V0ID0gdXNNUERVRE9mZnNldCAtIFdMQU5UTF9NUERVX0hFQURFUl9MRU47IAogICAgfQogICAgZWxzZQogICAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIGNvcnJ1cHRlZCAtIGRyb3BwaW5nIHBhY2tldCIpKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIGNvcnJ1cHRlZCAtIGRyb3BwaW5nIHBhY2tldCIpKTsKICAgIC8qIERyb3AgcGFja2V0ICovCiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CiAgfQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgaWYgKCBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0lzV2FwaVN0YSApCiAgewogICAgdm9zU3RhdHVzID0gV0xBTlRMX0dldEV0aGVyVHlwZShhdWNCREhlYWRlciwgdm9zRGF0YUJ1ZmYsIHVjTVBEVUhMZW4sICZ1c0V0aGVyVHlwZSk7CiAgICBpZiggVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykgKQogICAgewogICAgICBpZiAoIFdMQU5UTF9MTENfV0FJX1RZUEUgID09IHVzRXRoZXJUeXBlICkKICAgICAgeyAgICAgICAgCiAgICAgICAgaWYgKCAhKCBXTEFOSEFMX1JYX0lTX1VOUFJPVEVDVEVEX1dQSV9GUkFNRShhdWNCREhlYWRlcikpICkKICAgICAgICB7CiAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOldBSSBmcmFtZSB3YXMgcmVjZWl2ZWQgZW5jcnlwdGVkIC0gZHJvcHBpbmciKSk7CiAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgLypUZW1wb3JhcnkgZml4IGFkZGVkIHRvIGZpeCB3YXBpIHJla2V5IGlzc3VlKi8KICAgICAgICAgIC8vdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgIC8vcmV0dXJuIHZvc1N0YXR1czsgLy9yZXR1cm5pbmcgc3VjY2VzcwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBpZiAoICBXTEFOSEFMX1JYX0lTX1VOUFJPVEVDVEVEX1dQSV9GUkFNRShhdWNCREhlYWRlcikgKSAKICAgICAgICB7CiAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOk5vbi1XQUkgZnJhbWUgd2FzIHJlY2VpdmVkIHVuZW5jcnlwdGVkIC0gZHJvcHBpbmciKSk7CiAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsgCiAgICAgICAgICByZXR1cm4gdm9zU3RhdHVzOyAvL3JldHVybmluZyBzdWNjZXNzCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBlbHNlIC8vY291bGQgbm90IGV4dHJhY3QgRXRoZXJUeXBlIC0gdGhpcyBzaG91bGQgbm90IGhhcHBlbgogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q291bGQgbm90IGV4dHJhY3QgRXRoZXJUeXBlIikpOwogICAgICAvL1BhY2tldCBpcyBhbHJlYWR5IGZyZWVkCiAgICAgIHJldHVybiB2b3NTdGF0dXM7IC8vcmV0dXJuaW5nIGZhaWx1cmUKICAgIH0KICB9CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEluY3JlbWVudCByZWNlaXZlIGNvdW50ZXIKICAgICEhIG5vdCBzdXJlIHRoaXMgaXMgdGhlIGJlc3QgcGxhY2UgdG8gaW5jcmVhc2UgdGhpcyAtIHBrdCBtaWdodCBiZQogICAgZHJvcHBlZCBiZWxvdyBvciBkZWxheWVkIGluIFRMJ3MgcXVldWVzCiAgICAtIHdpbGwgbGVhdmUgaXQgaGVyZSBmb3Igbm93CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAhV0xBTlRMX1RJRF9JTlZBTElEKCB1Y1RpZCkgKSAKICB7CiAgICBwQ2xpZW50U1RBLT5hdVJ4Q291bnRbdWNUaWRdKys7CiAgfQogIGVsc2UKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCB0aWQgICVkIChTdGF0aW9uIElEICVkKSBvbiAlcyIsCiAgICAgICAgICAgdWNUaWQsIHVjU1RBSWQsIF9fZnVuY19fKSk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgQU1TRFUgYW5kIHNlbmQgZm9yIHByb2Nlc3NpbmcgaWYgc28KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y0FzZiA9ICh2X1U4X3QpV0RBX0dFVF9SWF9BU0YoYXVjQkRIZWFkZXIpOwoKICBpZiAoIDAgIT0gdWNBc2YgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOlBhY2tldCBpcyBBTVNEVSBzdWIgZnJhbWUgLSBzZW5kaW5nIGZvciBjb21wbGV0aW9uIikpOwogICAgdm9zU3RhdHVzID0gV0xBTlRMX0FNU0RVUHJvY2VzcyggcHZvc0dDdHgsICZ2b3NEYXRhQnVmZiwgYXVjQkRIZWFkZXIsIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCB1c01QRFVMZW4gKTsKICAgIGlmKE5VTEwgPT0gdm9zRGF0YUJ1ZmYpCiAgICB7CiAgICAgICAvL1BhY2tldCBpcyBhbHJlYWR5IGZyZWVkCiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogICAgfQogIH0KICAvKiBBZnRlciBBTVNEVSBoZWFkZXIgaGFuZGxlZAogICAqIEFNU0RVIGZyYW1lIGp1c3Qgc2FtZSB3aXRoIG5vcm1hbCBmcmFtZXMgKi8KICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBUcmFuc2xhdGluZyBoZWFkZXIgaWYgbmVjZXNhcnkKICAgICAgICEhIEZpeCBtZTogcm12IGNvbW1lbnRzIGJlbG93CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoKCAwID09IFdEQV9HRVRfUlhfRlRfRE9ORShhdWNCREhlYWRlcikgKSAmJgogICAgICAoIDAgIT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uKSAmJgogICAgICAoIFdMQU5UTF9JU19EQVRBX0ZSQU1FKFdEQV9HRVRfUlhfVFlQRV9TVUJUWVBFKGF1Y0JESGVhZGVyKSkgKSkKICB7CiAgICBpZigwID09IHVjTVBEVUhMZW4pCiAgICB7CiAgICAgIHVjTVBEVUhMZW4gPSB1Y1BNUERVSExlbjsKICAgIH0KICAgIGlmICh1c01QRFVET2Zmc2V0ID4gdWNNUERVSE9mZnNldCkKICAgIHsKICAgICAgdXNBY3R1YWxITGVuID0gdXNNUERVRE9mZnNldCAtIHVjTVBEVUhPZmZzZXQ7CiAgICB9CiAgICB2b3NTdGF0dXMgPSBXTEFOVExfVHJhbnNsYXRlODAyMTFUbzgwMjNIZWFkZXIoIHZvc0RhdGFCdWZmLCAmdm9zU3RhdHVzLCB1c0FjdHVhbEhMZW4sIAogICAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCBwVExDYiwgdWNTVEFJZCwgYkZvcndhcmRJQVBQd2l0aExMQyk7CgogICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB0byB0cmFuc2xhdGUgZnJvbSA4MDIuMTEgdG8gODAyLjMgLSBkcm9wcGluZyIpKTsKICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICAgfQogICAgfQogICAgLyogU29mdGFwIHJlcXVpcmVzIGFkZGl0aW9uYWwgSW5mbyBzdWNoIGFzIERlc3RpbmF0aW9uIFNUQUlEIGFuZCBBY2Nlc3MKICAgICAgIENhdGVnb3J5LiBWb3NjaGFpbiBvciBCdWZmZXIgcmV0dXJuZWQgYnkgQkEgd291bGQgYmUgdW5jaGFpbiBhbmQgdGhpcwogICAgICAgTWV0YSBEYXRhIHdvdWxkIGhlbHAgaW4gcm91dGluZyB0aGUgcGFja2V0cyB0byBhcHByb3ByaWF0ZSBEZXN0aW5hdGlvbiAqLwogICAgaWYoIFdMQU5fU1RBX1NPRlRBUCA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkKICAgIHsKICAgICAgIFNUQU1ldGFJbmZvUHRyID0gKHZfVTMyX3QgKikodWludHB0cl90KSh1Y1RpZCB8IChXREFfR0VUX1JYX0FERFIzX0lEWChhdWNCREhlYWRlcikgPDwgV0xBTlRMX1NUQUlEX09GRlNFVCkpOwogICAgICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KVNUQU1ldGFJbmZvUHRyKTsKICAgIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIHRvIHNlZSBpZiByZS1vcmRlcmluZyBzZXNzaW9uIGlzIGluIHBsYWNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAwICE9IHBDbGllbnRTVEEtPmF0bEJBUmVvcmRlckluZm9bdWNUaWRdLnVjRXhpc3RzICkKICB7CiAgICBXTEFOVExfTVNEVVJlb3JkZXIoIHBUTENiLCAmdm9zRGF0YUJ1ZmYsIGF1Y0JESGVhZGVyLCB1Y1NUQUlkLCB1Y1RpZCApOwogIH0KCmlmKDAgPT0gdWNVbmljYXN0QnJvYWRjYXN0VHlwZQojaWZkZWYgRkVBVFVSRV9PTl9DSElQX1JFT1JERVJJTkcKICAgJiYgKFdMQU5IQUxfSXNPbkNoaXBSZW9yZGVyaW5nRW5hYmxlZEZvclRJRChwdm9zR0N0eCwgdWNTVEFJZCwgdWNUaWQpICE9IFRSVUUpCiNlbmRpZgopCnsKICAvKiByZXBsYXkgY2hlY2sgY29kZSA6IGNoZWNrIHdoZXRoZXIgcmVwbGF5IGNoZWNrIGlzIG5lZWRlZCBvciBub3QgKi8KICBpZihWT1NfVFJVRSA9PSBwQ2xpZW50U1RBLT51Y0lzUmVwbGF5Q2hlY2tWYWxpZCkKICB7CiAgICAgIC8qIHJlcGxheSBjaGVjayBpcyBuZWVkZWQgZm9yIHRoZSBzdGF0aW9uICovCgogICAgICAvKiBjaGVjayB3aGV0aGVyIGZyYW1lIGlzIEFNU0RVIGZyYW1lICovCiAgICAgIGlmICggMCAhPSB1Y0FzZiApCiAgICAgIHsKICAgICAgICAgIC8qIFNpbmNlIHZpcmdvIGNhbid0IHNlbmQgQU1TRFUgZnJhbWVzIHRoaXMgbGVnIG9mIHRoZSBjb2RlIAogICAgICAgICAgICAgd2FzIG5vdCB0ZXN0ZWQgcHJvcGVybHksIGl0IG5lZWRzIHRvIGJlIHRlc3RlZCBwcm9wZXJseSovCiAgICAgICAgICAvKiBGcmFtZSBpcyBBTVNEVSBmcmFtZS4gQXMgcGVyIDgwMi4xMW4gb25seSBmaXJzdAogICAgICAgICAgICAgc3ViZnJhbWUgd2lsbCBoYXZlIHJlcGxheSBjb3VudGVyICovCiAgICAgICAgICB1Y0VzZiA9ICBXREFfR0VUX1JYX0VTRiggYXVjQkRIZWFkZXIgKTsKICAgICAgICAgIGlmKCAwICE9IHVjRXNmICkKICAgICAgICAgIHsKICAgICAgICAgICAgICB2X0JPT0xfdCBzdGF0dXM7CiAgICAgICAgICAgICAgLyogR2V0dGluZyA0OC1iaXQgcmVwbGF5IGNvdW50ZXIgZnJvbSB0aGUgUlggQkQgKi8KICAgICAgICAgICAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA9IFdEQV9EU19HZXRSZXBsYXlDb3VudGVyKGF1Y0JESGVhZGVyKTsKIAogICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBBTVNEVSBjdXJyZW50UmVwbGF5Q291bnRlciBbMHglbGxYXSIsdWxsY3VycmVudFJlcGxheUNvdW50ZXIpOwogICAgICAgICAgICAgIAogICAgICAgICAgICAgIC8qIEdldHRpbmcgNDgtYml0IHByZXZpb3VzIHJlcGxheSBjb3VudGVyIGZyb20gVEwgY29udHJvbCAgYmxvY2sgKi8KICAgICAgICAgICAgICB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIgPSBwQ2xpZW50U1RBLT51bGxSZXBsYXlDb3VudGVyW3VjVGlkXTsKCiAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgIldMQU4gVEw6IEFNU0RVIHByZXZpb3VzUmVwbGF5Q291bnRlciBbMHglbGxYXSIsdWxscHJldmlvdXNSZXBsYXlDb3VudGVyKTsKCiAgICAgICAgICAgICAgLyogSXQgaXMgZmlyc3Qgc3ViZnJhbWUgb2YgQU1TRFUgdGh1cyBpdAogICAgICAgICAgICAgICAgIGNvbmF0YWlucyByZXBsYXkgY291bnRlciBwZXJmb3JtIHRoZQogICAgICAgICAgICAgICAgIHJlcGxheSBjaGVjayBmb3IgdGhpcyBmaXJzdCBzdWJmcmFtZSovCiAgICAgICAgICAgICAgc3RhdHVzID0gIFdMQU5UTF9Jc1JlcGxheVBhY2tldCggdWxsY3VycmVudFJlcGxheUNvdW50ZXIsIHVsbHByZXZpb3VzUmVwbGF5Q291bnRlcik7CiAgICAgICAgICAgICAgaWYoVk9TX0ZBTFNFID09IHN0YXR1cykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAvKiBOb3QgYSByZXBsYXkgcGFrZXQsIHVwZGF0ZSBwcmV2aW91cyByZXBsYXkgY291bnRlciBpbiBUTCBDQiAqLyAgICAKICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVsbFJlcGxheUNvdW50ZXJbdWNUaWRdID0gdWxsY3VycmVudFJlcGxheUNvdW50ZXI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogQU1TRFUgRHJvcCB0aGUgcmVwbGF5IHBhY2tldCB3aXRoIFBOIDogWzB4JWxsWF0iLHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKTsKCiAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVsVG90YWxSZXBsYXlQYWNrZXRzRGV0ZWN0ZWQrKzsKICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBBTVNEVSB0b3RhbCBkcm9wcGVkIHJlcGxheSBwYWNrZXRzIG9uIFNUQSBJRCAlWCBpcyBbMHglWF0iLAogICAgICAgICAgICAgICAgICB1Y1NUQUlkLCAgcENsaWVudFNUQS0+dWxUb3RhbFJlcGxheVBhY2tldHNEZXRlY3RlZCk7CgogICAgICAgICAgICAgICAgICAvKiBEcm9wIHRoZSBwYWNrZXQgKi8KICAgICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgICAgdl9CT09MX3Qgc3RhdHVzOwoKICAgICAgICAgICAvKiBHZXR0aW5nIDQ4LWJpdCByZXBsYXkgY291bnRlciBmcm9tIHRoZSBSWCBCRCAqLwogICAgICAgICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyID0gV0RBX0RTX0dldFJlcGxheUNvdW50ZXIoYXVjQkRIZWFkZXIpOwoKICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgIldMQU4gVEw6IE5vbi1BTVNEVSBjdXJyZW50UmVwbGF5Q291bnRlciBbMHglbGxYXSIsdWxsY3VycmVudFJlcGxheUNvdW50ZXIpOwoKICAgICAgICAgICAvKiBHZXR0aW5nIDQ4LWJpdCBwcmV2aW91cyByZXBsYXkgY291bnRlciBmcm9tIFRMIGNvbnRyb2wgIGJsb2NrICovCiAgICAgICAgICAgdWxscHJldmlvdXNSZXBsYXlDb3VudGVyID0gcENsaWVudFNUQS0+dWxsUmVwbGF5Q291bnRlclt1Y1RpZF07CgogICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBOb24tQU1TRFUgcHJldmlvdXNSZXBsYXlDb3VudGVyIFsweCVsbFhdIix1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIpOwoKICAgICAgICAgICAvKiBJdCBpcyBub3QgQU1TRFUgZnJhbWUgc28gcGVyZm9ybSAKICAgICAgICAgICAgICByZWFwbHkgY2hlY2sgZm9yIGVhY2ggcGFja2V0LCBhcwogICAgICAgICAgICAgIGVhY2ggcGFja2V0IGNvbnRhaW5zIHZhbGlkIHJlcGxheSBjb3VudGVyKi8gCiAgICAgICAgICAgc3RhdHVzID0gIFdMQU5UTF9Jc1JlcGxheVBhY2tldCggdWxsY3VycmVudFJlcGxheUNvdW50ZXIsIHVsbHByZXZpb3VzUmVwbGF5Q291bnRlcik7CiAgICAgICAgICAgaWYoVk9TX0ZBTFNFID09IHN0YXR1cykKICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBOb3QgYSByZXBsYXkgcGFrZXQsIHVwZGF0ZSBwcmV2aW91cyByZXBsYXkgY291bnRlciBpbiBUTCBDQiAqLyAgICAKICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVsbFJlcGxheUNvdW50ZXJbdWNUaWRdID0gdWxsY3VycmVudFJlcGxheUNvdW50ZXI7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UKICAgICAgICAgICB7CiAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBOb24tQU1TRFUgRHJvcCB0aGUgcmVwbGF5IHBhY2tldCB3aXRoIFBOIDogWzB4JWxsWF0iLHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKTsKCiAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVsVG90YWxSZXBsYXlQYWNrZXRzRGV0ZWN0ZWQrKzsKICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDogTm9uLUFNU0RVIHRvdGFsIGRyb3BwZWQgcmVwbGF5IHBhY2tldHMgb24gU1RBIElEICVYIGlzIFsweCVYXSIsCiAgICAgICAgICAgICAgICB1Y1NUQUlkLCBwQ2xpZW50U1RBLT51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkKTsKCiAgICAgICAgICAgICAgIC8qIFJlcGFseSBwYWNrZXQsIGRyb3AgdGhlIHBhY2tldCAqLwogICAgICAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogICAgICAgICAgIH0KICAgICAgfQogIH0KfQovKkl0IGlzIGEgYnJvYWRhc3QgcGFja2V0IERQVSBoYXMgYWxyZWFkeSBkb25lIHJlcGxheSBjaGVjayBmb3IgCiAgYnJvYWRjYXN0IHBhY2tldHMgbm8gbmVlZCB0byBkbyByZXBsYXkgY2hlY2sgb2YgdGhlc2UgcGFja2V0cyovCgogIGlmICggTlVMTCAhPSB2b3NEYXRhQnVmZiApCiAgewogICAgaWYoIFdMQU5fU1RBX1NPRlRBUCA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkKICAgIHsKICAgICAgV0xBTlRMX0Z3ZFBrdFRvSEREKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsIHVjU1RBSWQgKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgd1J4TWV0YUluZm8udWNVUCA9IHVjVGlkOwogICAgICB3UnhNZXRhSW5mby5yc3NpQXZnID0gcENsaWVudFNUQS0+cnNzaUF2ZzsKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgICAgIGlmIChXTEFOX1NUQV9URExTID09IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlKQogICAgICB7CiAgICAgICAgICB3UnhNZXRhSW5mby5pc1N0YVRkbHMgPSBUUlVFOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAgd1J4TWV0YUluZm8uaXNTdGFUZGxzID0gRkFMU0U7CiAgICAgIH0KI2VuZGlmCiAgICAgIHBDbGllbnRTVEEtPnBmblNUQVJ4KCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndSeE1ldGFJbmZvICk7CiAgICB9CiAgfS8qIGlmIG5vdCBOVUxMICovCgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU1RBUnhBdXRoICovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFSeERpc2MKCiAgREVTQ1JJUFRJT04KICAgIFJlY2VpdmUgaW4gZGlzY29ubmVjdGVkIHN0YXRlIC0gbm8gZGF0YSBhbGxvd2VkCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFNUQSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgcnggdm9zIGJ1ZmZlcgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TVEFSeERpc2MKKAogIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICB1Y1NUQUlkLAogIHZvc19wa3RfdCoqICAgcHZvc0RhdGFCdWZmLAogIHZfQk9PTF90ICAgICAgYkZvcndhcmRJQVBQd2l0aExMQwopCnsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkgfHwgKCBOVUxMID09ICAqcHZvc0RhdGFCdWZmICkpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1NUQVJ4RGlzYyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXJyb3IgLSBkcm9wIHBhY2tldAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOlBhY2tldCBzaG91bGQgbm90IGJlIHJlY2VpdmVkIGluIHN0YXRlIGRpc2Nvbm5lY3RlZCIKICAgICAgICAgICAgICIgLSBkcm9wcGluZyIpKTsKICB2b3NfcGt0X3JldHVybl9wYWNrZXQoKnB2b3NEYXRhQnVmZik7CiAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU1RBUnhEaXNjICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIFByb2Nlc3NpbmcgbWFpbiBsb29wcyBmb3IgTUFJTiBhbmQgVFggdGhyZWFkcwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfTWNQcm9jZXNzTXNnCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgVk9TUyB3aGVuIGEgbWVzc2FnZSB3YXMgc2VyaWFsaXplZCBmb3IgVEwgdGhyb3VnaCB0aGUKICAgIG1haW4gdGhyZWFkL3Rhc2suCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIG1lc3NhZ2U6ICAgICAgICB0eXBlIGFuZCBjb250ZW50IG9mIHRoZSBtZXNzYWdlCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9NY1Byb2Nlc3NNc2cKKAogIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgsCiAgdm9zX21zZ190KiAgICAgICBtZXNzYWdlCikKewogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogICB0QWRkQkFJbmQqICAgICAgcHRBZGRCYUluZCA9IE5VTEw7CiAgIHREZWxCQUluZCogICAgICBwdERlbEJhSW5kID0gTlVMTDsKICAgdEFkZEJBUnNwKiAgICAgIHB0QWRkQmFSc3AgPSBOVUxMOwogICB2b3NfbXNnX3QgICAgICAgdm9zTWVzc2FnZTsKICAgVk9TX1NUQVRVUyAgICAgIHZvc1N0YXR1czsKICAgdHBGbHVzaEFDUnNwIEZsdXNoQUNSc3BQdHI7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gbWVzc2FnZSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9Qcm9jZXNzTWFpbk1lc3NhZ2UiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1Byb2Nlc3NNYWluTWVzc2FnZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICJXTEFOIFRMOlJlY2VpdmVkIG1lc3NhZ2U6ICVkIHRocm91Z2ggbWFpbiBmbG93IiwgbWVzc2FnZS0+dHlwZSkpOwoKICBzd2l0Y2goIG1lc3NhZ2UtPnR5cGUgKQogIHsKICBjYXNlIFdEQV9UTF9GTFVTSF9BQ19SU1A6CiAgICAvLyBFeHRyYWN0IHRoZSBtZXNzYWdlIGZyb20gdGhlIG1lc3NhZ2UgYm9keQogICAgRmx1c2hBQ1JzcFB0ciA9ICh0cEZsdXNoQUNSc3ApKG1lc3NhZ2UtPmJvZHlwdHIpOwogICAgLy8gTWFrZSBzdXJlIHRoZSBjYWxsIGJhY2sgZnVuY3Rpb24gaXMgbm90IG51bGwuCiAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnBmbkZsdXNoT3BDb21wbGV0ZUNiICkKICAgIHsKICAgICAgVk9TX0FTU0VSVCgwKTsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIHBmbkZsdXNoT3BDb21wbGV0ZUNiIikpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfQoKICAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgIlJlY2VpdmVkIG1lc3NhZ2U6ICBGbHVzaCBjb21wbGV0ZSByZWNlaXZlZCBieSBUTCIpKTsKCiAgICAvLyBTaW5jZSB3ZSBoYXZlIHRoZSByZXNwb25zZSBiYWNrIGZyb20gSEFMLCBqdXN0IGNhbGwgdGhlIEJBUCBjbGllbnQKICAgIC8vIHJlZ2lzdGVyZWQgY2FsbCBiYWNrIGZyb20gVEwuIFRoZXJlIGlzIG9ubHkgMSBwb3NzaWJsZQogICAgLy8gQkFQIGNsaWVudC4gU28gZGlyZWN0bHkgcmVmZXJlbmNlIHRsQkFQQ2xpZW50CiAgICBwVExDYi0+dGxCQVBDbGllbnQucGZuRmx1c2hPcENvbXBsZXRlQ2IoIHB2b3NHQ3R4LAogICAgICAgICAgICBGbHVzaEFDUnNwUHRyLT51Y1NUQUlkLAogICAgICAgICAgICBGbHVzaEFDUnNwUHRyLT51Y1RpZCwgRmx1c2hBQ1JzcFB0ci0+c3RhdHVzICk7CgogICAgLy8gRnJlZSB0aGUgUEFMIG1lbW9yeSwgd2UgYXJlIGRvbmUgd2l0aCBpdC4KICAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAiRmx1c2ggY29tcGxldGUgcmVjZWl2ZWQgYnkgVEw6IEZyZWVpbmcgJXAiLCBGbHVzaEFDUnNwUHRyKSk7CiAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90ICopRmx1c2hBQ1JzcFB0cik7CiAgICBicmVhazsKCiAgY2FzZSBXREFfSEREX0FEREJBX1JFUToKICAgcHRBZGRCYUluZCA9ICh0QWRkQkFJbmQqKShtZXNzYWdlLT5ib2R5cHRyKTsKICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9CYVNlc3Npb25BZGQoIHB2b3NHQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdEFkZEJhSW5kLT5iYVNlc3Npb24uYmFTZXNzaW9uSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdEFkZEJhSW5kLT5iYVNlc3Npb24uU1RBSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdEFkZEJhSW5kLT5iYVNlc3Npb24uYmFUSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1UzMl90KXB0QWRkQmFJbmQtPmJhU2Vzc2lvbi5iYUJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0QWRkQmFJbmQtPmJhU2Vzc2lvbi53aW5TaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdEFkZEJhSW5kLT5iYVNlc3Npb24uU1NOKTsKICAgIHB0QWRkQmFSc3AgPSB2b3NfbWVtX21hbGxvYyhzaXplb2YoKnB0QWRkQmFSc3ApKTsKCiAgICBpZiAoIE5VTEwgPT0gcHRBZGRCYVJzcCApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOiBmYXRhbCBmYWlsdXJlLCBjYW5ub3QgYWxsb2NhdGUgQkEgUnNwIHN0cnVjdHVyZSIpKTsKICAgICAgVk9TX0FTU0VSVCgwKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKICAgIH0KCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSB2b3NTdGF0dXMgKQogICAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgIldMQU4gVEw6IFNlbmRpbmcgc3VjY2VzcyBpbmRpY2F0aW9uIHRvIEhBTCBmb3IgQUREIEJBIikpOwogICAgICAvKlNlbmQgc3VjY2VzcyovCiAgICAgIHB0QWRkQmFSc3AtPm1lc2dUeXBlICAgID0gV0RBX0hERF9BRERCQV9SU1A7CiAgICAgIHZvc01lc3NhZ2UudHlwZSAgICAgICAgID0gV0RBX0hERF9BRERCQV9SU1A7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFNlbmRpbmcgZmFpbHVyZSBpbmRpY2F0aW9uIHRvIEhBTCBmb3IgQUREIEJBIikpOwoKICAgICAgLypTZW5kIGZhaWx1cmUqLwogICAgICBwdEFkZEJhUnNwLT5tZXNnVHlwZSAgICA9IFdEQV9CQV9GQUlMX0lORDsKICAgICAgdm9zTWVzc2FnZS50eXBlICAgICAgICAgPSBXREFfQkFfRkFJTF9JTkQ7CiAgICB9CgogICAgcHRBZGRCYVJzcC0+bWVzZ0xlbiAgICAgPSBzaXplb2YodEFkZEJBUnNwKTsKICAgIHB0QWRkQmFSc3AtPmJhU2Vzc2lvbklEID0gcHRBZGRCYUluZC0+YmFTZXNzaW9uLmJhU2Vzc2lvbklEOwogICAgICAvKiBUaGlzIGlzIGRlZmF1bHQsIHJlcGx5IHdpbiBzaXplIGhhcyB0byBiZSBoYW5kbGVkIEJBIG1vZHVsZSwgRklYIFRISVMgKi8KICAgICAgcHRBZGRCYVJzcC0+cmVwbHlXaW5TaXplID0gV0xBTlRMX01BWF9XSU5TSVpFOwogICAgdm9zTWVzc2FnZS5ib2R5cHRyID0gcHRBZGRCYVJzcDsKCiAgICB2b3NfbXFfcG9zdF9tZXNzYWdlKCBWT1NfTVFfSURfV0RBLCAmdm9zTWVzc2FnZSApOwogICAgV0xBTlRMX01jRnJlZU1zZyAocHZvc0dDdHgsIG1lc3NhZ2UpOwogIGJyZWFrOwogIGNhc2UgV0RBX0RFTEVURUJBX0lORDoKICAgIHB0RGVsQmFJbmQgPSAodERlbEJBSW5kKikobWVzc2FnZS0+Ym9keXB0cik7CiAgICB2b3NTdGF0dXMgID0gV0xBTlRMX0JhU2Vzc2lvbkRlbChwdm9zR0N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHREZWxCYUluZC0+c3RhSWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdERlbEJhSW5kLT5iYVRJRCk7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOiBGYWlsZWQgdG8gZGVsIEJBIHNlc3Npb24gU1RBOiVkIFRJRDolZCBTdGF0dXMgOiVkIiwKICAgICAgICAgICAgICAgcHREZWxCYUluZC0+c3RhSWR4LAogICAgICAgICAgICAgICBwdERlbEJhSW5kLT5iYVRJRCwKICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CiAgICB9CiAgICBXTEFOVExfTWNGcmVlTXNnIChwdm9zR0N0eCwgbWVzc2FnZSk7CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgLypubyBwcm9jZXNzaW5nIGZvciBub3cqLwogICAgYnJlYWs7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1Byb2Nlc3NNYWluTWVzc2FnZSAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9NY0ZyZWVNc2cKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBWT1NTIHRvIGZyZWUgYSBnaXZlbiBUTCBtZXNzYWdlIG9uIHRoZSBNYWluIHRocmVhZCB3aGVuIHRoZXJlCiAgICBhcmUgbWVzc2FnZXMgcGVuZGluZyBpbiB0aGUgcXVldWUgd2hlbiB0aGUgd2hvbGUgc3lzdGVtIGlzIGJlZW4gcmVzZXQuCiAgICBGb3Igbm93LCBUTCBkb2VzIG5vdCBhbGxvY2F0ZSBhbnkgYm9keSBzbyB0aGlzIGZ1bmN0aW9uIHNob3V0IHRyYW5zbGF0ZQogICAgaW50byBhIE5PT1AKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgbWVzc2FnZTogICAgICAgIHR5cGUgYW5kIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX01jRnJlZU1zZwooCiAgdl9QVk9JRF90ICAgICAgICBwdm9zR0N0eCwKICB2b3NfbXNnX3QqICAgICAgIG1lc3NhZ2UKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gbWVzc2FnZSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9NY0ZyZWVNc2ciKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX01jRnJlZU1zZyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICJXTEFOIFRMOlJlY2VpdmVkIG1lc3NhZ2U6ICVkIHRocm91Z2ggbWFpbiBmcmVlIiwgbWVzc2FnZS0+dHlwZSkpOwoKICBzd2l0Y2goIG1lc3NhZ2UtPnR5cGUgKQogIHsKICBjYXNlIFdEQV9IRERfQUREQkFfUkVROgogIGNhc2UgV0RBX0RFTEVURUJBX0lORDoKICAgIC8qdm9zIGZyZWUgYm9keSBwb2ludGVyKi8KICAgIHZvc19tZW1fZnJlZShtZXNzYWdlLT5ib2R5cHRyKTsKICAgIG1lc3NhZ2UtPmJvZHlwdHIgPSBOVUxMOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIC8qbm8gcHJvY2Vzc2luZyBmb3Igbm93Ki8KICAgIGJyZWFrOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qV0xBTlRMX01jRnJlZU1zZyovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1R4UHJvY2Vzc01zZwoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFZPU1Mgd2hlbiBhIG1lc3NhZ2Ugd2FzIHNlcmlhbGl6ZWQgZm9yIFRMIHRocm91Z2ggdGhlCiAgICB0eCB0aHJlYWQvdGFzay4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgbWVzc2FnZTogICAgICAgIHR5cGUgYW5kIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIE90aGVyIHZhbHVlcyBjYW4gYmUgcmV0dXJuZWQgYXMgYSByZXN1bHQgb2YgYSBmdW5jdGlvbiBjYWxsLCBwbGVhc2UgY2hlY2sKICBjb3JyZXNwb25kaW5nIEFQSSBmb3IgbW9yZSBpbmZvLgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1R4UHJvY2Vzc01zZwooCiAgdl9QVk9JRF90ICAgICAgICBwdm9zR0N0eCwKICB2b3NfbXNnX3QqICAgICAgIG1lc3NhZ2UKKQp7CiAgIFZPU19TVEFUVVMgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQpOwogICB2b2lkICpjYWxsYmFja0NvbnRleHQ7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gbWVzc2FnZSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9Qcm9jZXNzVHhNZXNzYWdlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBQcm9jZXNzIG1lc3NhZ2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmVjZWl2ZWQgbWVzc2FnZTogJWQgdGhyb3VnaCB0eCBmbG93IiwgbWVzc2FnZS0+dHlwZSkpOwoKICBzd2l0Y2goIG1lc3NhZ2UtPnR5cGUgKQogIHsKICBjYXNlIFdMQU5UTF9UWF9TSUdfU1VTUEVORDoKICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9TdXNwZW5kQ0IoIHB2b3NHQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0xBTlRMX1N1c3BlbmRDQlR5cGUpbWVzc2FnZS0+Ym9keXB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+cmVzZXJ2ZWQpOwogICAgYnJlYWs7CiAgY2FzZSBXTEFOVExfVFhfUkVTX05FRURFRDoKICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9HZXRUeFJlc291cmNlc0NCKCBwdm9zR0N0eCApOwogICAgIGJyZWFrOwoKICBjYXNlIFdEQV9EU19UWF9TVEFSVF9YTUlUOgogICAgICBXTEFOVExfQ2xlYXJUeFhtaXRQZW5kaW5nKHB2b3NHQ3R4KTsKICAgICAgdm9zU3RhdHVzID0gV0RBX0RTX1R4RnJhbWVzKCBwdm9zR0N0eCApOwogICAgICBicmVhazsKCiAgY2FzZSBXREFfRFNfRklOSVNIX1VMQToKICAgIGNhbGxiYWNrQ29udGV4dCA9IG1lc3NhZ2UtPmJvZHlwdHI7CiAgICBjYWxsYmFja1JvdXRpbmUgPSBtZXNzYWdlLT5jYWxsYmFjazsKICAgIGlmICggTlVMTCAhPSBjYWxsYmFja1JvdXRpbmUgKQogICAgewogICAgICBjYWxsYmFja1JvdXRpbmUoY2FsbGJhY2tDb250ZXh0KTsKICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIFdMQU5UTF9UWF9TTkFQU0hPVDoKICAgIC8qRHVtcGluZyBUTCBTdGF0ZSBhbmQgdGhlbiBjb250aW51aW5nIHRvIHByaW50CiAgICAgIHRoZSBEWEUgRHVtcCovCiAgICBXTEFOVExfVHhUaHJlYWREZWJ1Z0hhbmRsZXIocHZvc0dDdHgpOwogICAgV0RBX1RyYW5zcG9ydENoYW5uZWxEZWJ1ZyhOVUxMLCBWT1NfVFJVRSwgVk9TX0ZBTFNFKTsKICAgIGJyZWFrOwoKICBjYXNlIFdMQU5UTF9UWF9GQVRBTF9FUlJPUjoKICAgIFdMQU5UTF9GYXRhbEVycm9ySGFuZGxlcihwdm9zR0N0eCk7CiAgICBicmVhazsKCiAgY2FzZSBXTEFOVExfVFhfRldfREVCVUc6CiAgICB2b3NfZndEdW1wUmVxKDI3NCwgMCwgMCwgMCwgMCk7CiAgICBicmVhazsKCiAgZGVmYXVsdDoKICAgIC8qbm8gcHJvY2Vzc2luZyBmb3Igbm93Ki8KICAgIGJyZWFrOwogIH0KCiAgcmV0dXJuIHZvc1N0YXR1czsKfS8qIFdMQU5UTF9UeFByb2Nlc3NNc2cgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfTWNGcmVlTXNnCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgVk9TUyB0byBmcmVlIGEgZ2l2ZW4gVEwgbWVzc2FnZSBvbiB0aGUgTWFpbiB0aHJlYWQgd2hlbiB0aGVyZQogICAgYXJlIG1lc3NhZ2VzIHBlbmRpbmcgaW4gdGhlIHF1ZXVlIHdoZW4gdGhlIHdob2xlIHN5c3RlbSBpcyBiZWVuIHJlc2V0LgogICAgRm9yIG5vdywgVEwgZG9lcyBub3QgYWxsb2NhdGUgYW55IGJvZHkgc28gdGhpcyBmdW5jdGlvbiBzaG91dCB0cmFuc2xhdGUKICAgIGludG8gYSBOT09QCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIG1lc3NhZ2U6ICAgICAgICB0eXBlIGFuZCBjb250ZW50IG9mIHRoZSBtZXNzYWdlCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeEZyZWVNc2cKKAogIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgsCiAgdm9zX21zZ190KiAgICAgICBtZXNzYWdlCikKewogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKk5vdGhpbmcgdG8gZG8gZm9yIG5vdyEhISovCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qV0xBTlRMX1R4RnJlZU1zZyovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9UeEZDRnJhbWUKCiAgREVTQ1JJUFRJT04KICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gdG8gc2VuZCBGQyBmcmFtZS4gRW5hYmxlCiAgICBvciBkaXNhYmxlIExXTSBtb2RlIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbi4KCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIEZXIHNlbmRzIHVwIHNwZWNpYWwgZmxvdyBjb250cm9sIGZyYW1lLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBvaW50ZXJzIGFyZSBOVUxMLgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIFNvbWV0aGluZyBpcyB3cm9uZy4KICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QuCgogIFNJREUgRUZGRUNUUwogICAgTmV3bHkgZm9ybWVkIEZDIGZyYW1lIGlzIGdlbmVyYXRlZCBhbmQgd2FpdHMgdG8gYmUgdHJhbnNtaXR0ZWQuIFByZXZpb3VzbHkgdW5zZW50IGZyYW1lIHdpbGwKICAgIGJlIHJlbGVhc2VkLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1R4RkNGcmFtZQooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4CikKewojaWYgMAogIFdMQU5UTF9DYlR5cGUqICAgICAgcFRMQ2IgPSBOVUxMOwogIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzOwogIHRwSGFsRmNUeEJkICAgICAgICAgcHZGY1R4QmQgPSBOVUxMOwogIHZvc19wa3RfdCAqICAgICAgICAgcFBhY2tldCA9IE5VTEw7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y1NUQUlkID0gMDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjQml0Q2hlY2sgPSAxOwoKICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiV0xBTiBUTDogU2VuZCBGQyBmcmFtZSAlcyIsIF9fZnVuY19fKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHZvc0dDdHggKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CgogIGlmIChOVUxMID09IHBUTENiKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBvaW50ZXIgaW4gJXMgXG4iLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CiAgCiAgLy9HZXQgb25lIHZvc3MgcGFja2V0CiAgdm9zU3RhdHVzID0gdm9zX3BrdF9nZXRfcGFja2V0KCAmcFBhY2tldCwgVk9TX1BLVF9UWVBFX1RYXzgwMl8xMV9NR01ULCBzaXplb2YodEhhbEZjVHhCZCksIDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfRkFMU0UsIE5VTEwsIE5VTEwgKTsKCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICB7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgdm9zU3RhdHVzID0gdm9zX3BrdF9yZXNlcnZlX2hlYWQoIHBQYWNrZXQsICh2b2lkICopJnB2RmNUeEJkLCBzaXplb2YodEhhbEZjVHhCZCkpOwoKICBpZiggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICIlczogZmFpbGVkIHRvIHJlc2VydmUgRkMgVFggQkQgJWRcbiIsX19mdW5jX18sIHNpemVvZih0SGFsRmNUeEJkKSkpOwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCBwUGFja2V0ICk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLy9HZW5lcmF0ZSBtb3N0IHJlY2VudCB0bEZDSW5mby4gTW9zdCBmaWVsZHMgYXJlIGNvcnJlY3QuCiAgcFRMQ2ItPnRsRkNJbmZvLmZjU1RBVGhyZXNoRW5hYmxlZE1hc2sgPSAwOwogIHBUTENiLT50bEZDSW5mby5mY1NUQVR4TW9yZURhdGFNYXNrID0gMDsKICBmb3IoIHVjU1RBSWQgPSAwLCB1Y0JpdENoZWNrID0gMSA7IHVjU1RBSWQgPCBXTEFOX01BWF9TVEFfQ09VTlQ7IHVjQml0Q2hlY2sgPDw9IDEsIHVjU1RBSWQgKyspCiAgewogICAgaWYgKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNFeGlzdHMpCiAgICB7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIGlmIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y1BrdFBlbmRpbmcpCiAgICB7CiAgICAgIHBUTENiLT50bEZDSW5mby5mY1NUQVR4TW9yZURhdGFNYXNrIHw9IHVjQml0Q2hlY2s7CiAgICB9CgogICAgaWYgKCAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21Nb2RlRW5hYmxlZCkgJiYKICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmJtdU1lbUNvbnN1bWVkID4gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUx3bVRocmVzaG9sZCkpCiAgICB7CiAgICAgIHBUTENiLT50bEZDSW5mby5mY1NUQVRocmVzaEVuYWJsZWRNYXNrIHw9IHVjQml0Q2hlY2s7CgogICAgICBwVExDYi0+dGxGQ0luZm8uZmNTVEFUaHJlc2hbdWNTVEFJZF0gPSAodEFOSV9VOClwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51THdtVGhyZXNob2xkOwoKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21FdmVudFJlcG9ydGVkID0gRkFMU0U7CiAgICB9CgogIH0KICAKICAvL3JlcXVlc3QgaW1tZWRpYXRlIGZlZWRiYWNrCiAgcFRMQ2ItPnRsRkNJbmZvLmZjQ29uZmlnIHw9IDB4NDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogIC8vZmlsbCBpbiBCRCB0byBzZW50CiAgdm9zU3RhdHVzID0gV0xBTkhBTF9GaWxsRmNUeEJkKHB2b3NHQ3R4LCAmcFRMQ2ItPnRsRkNJbmZvLCAodm9pZCAqKXB2RmNUeEJkKTsKCiAgaWYoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiJXM6IEZpbGwgRkMgVFggQkQgdW5zdWNjZXNzZnVsXG4iLCBfX2Z1bmNfXykpOwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCBwUGFja2V0ICk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKE5VTEwgIT0gcFRMQ2ItPnZvc1R4RkNCdWYpCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiJXM6IFByZXZpb3VzIEZDIFRYIEJEIG5vdCBzZW50XG4iLCBfX2Z1bmNfXykpOwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT52b3NUeEZDQnVmKTsKICB9CgogIHBUTENiLT52b3NUeEZDQnVmID0gcFBhY2tldDsKCiAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggcFBhY2tldCwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KVdMQU5UTF9UeENvbXBEZWZhdWx0Q2IpOwogIHZvc1N0YXR1cyA9IFdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDogc2VuZCBGQyBmcmFtZSBsZWF2ZSAlcyIsIF9fZnVuY19fKSk7CiNlbmRpZgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFR4UmVzb3VyY2VzQ0IKCiAgREVTQ1JJUFRJT04KICAgIFByb2Nlc3NpbmcgZnVuY3Rpb24gZm9yIFJlc291cmNlIG5lZWRlZCBzaWduYWwuIEEgcmVxdWVzdCB3aWxsIGJlIGlzc3VlZAogICAgdG8gQkFMIHRvIGdldCBtb3JlIHR4IHJlc291cmNlcy4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgT3RoZXIgdmFsdWVzIGNhbiBiZSByZXR1cm5lZCBhcyBhIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIGNhbGwsIHBsZWFzZSBjaGVjawogIGNvcnJlc3BvbmRpbmcgQVBJIGZvciBtb3JlIGluZm8uCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0VHhSZXNvdXJjZXNDQgooCiAgdl9QVk9JRF90ICAgICAgICBwdm9zR0N0eAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgICAgICA9IE5VTEw7CiAgdl9VMzJfdCAgICAgICAgIHVSZXNDb3VudCAgPSBXREFfVExJX01JTl9SRVNfREFUQTsKICBWT1NfU1RBVFVTICAgICAgdm9zU3RhdHVzICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICB2X1U4X3QgICAgICAgICAgdWNNZ210ICAgICA9IDA7CiAgdl9VOF90ICAgICAgICAgIHVjQkFQICAgICAgPSAwOwogIHZfVThfdCAgICAgICAgICB1Y0RhdGEgICAgID0gMDsKI2lmZGVmIFdMQU5fU09GVEFQX0ZMT1dDVFJMX0VOCiAgdEJzc1N5c3RlbVJvbGUgc3lzdGVtUm9sZTsKICB0cEFuaVNpckdsb2JhbCBwTWFjOwojZW5kaWYKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24iCiAgICAgICAgICAgICAgICIgV0xBTlRMX1Byb2Nlc3NUeE1lc3NhZ2UiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEdldCB0eCByZXNvdXJjZXMgZnJvbSBCQUwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NTdGF0dXMgPSBXREFfRFNfR2V0VHhSZXNvdXJjZXMoIHB2b3NHQ3R4LCAmdVJlc0NvdW50ICk7CgogIGlmICggKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpICYmIChWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTICE9IHZvc1N0YXR1cykpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpUTCBmYWlsZWQgdG8gZ2V0IHJlc291cmNlcyBmcm9tIEJBTCwgRXJyOiAlZCIsCiAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qIEN1cnJlbnRseSBvbmx5IExpbnV4IEJBTCByZXR1cm5zIHRoZSBFX1JFU09VUkNFUyBlcnJvciBjb2RlIHdoZW4gaXQgaXMgcnVubmluZyAKICAgICBvdXQgb2YgQkQvUERVcy4gVG8gbWFrZSB1c2Ugb2YgdGhpcyBpbnRlcnJ1cHQgZm9yIHRocm91Z2hwdXQgZW5oYW5jZW1lbnQsIHNpbWlsYXIKICAgICBjaGFuZ2VzIHNob3VsZCBiZSBkb25lIGluIEJBTCBjb2RlIG9mIEFNU1MgYW5kIFdNICovCiAgaWYgKFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgPT0gdm9zU3RhdHVzKQogIHsKI2lmZGVmIFZPTEFOU19QRVJGCiAgICAgV0xBTkhBTF9FbmFibGVJZGxlQmRQZHVJbnRlcnJ1cHQocHZvc0dDdHgsICh0QU5JX1U4KWJkUGR1SW50ZXJydXB0R2V0VGhyZXNob2xkKTsKICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBFbmFibGluZyBJZGxlIEJEL1BEVSBpbnRlcnJ1cHQsIEN1cnJlbnQgcmVzb3VyY2VzID0gJWQiLCB1UmVzQ291bnQpOwojZWxzZQogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwojZW5kaWYKICB9CgogIHBUTENiLT51UmVzQ291bnQgPSB1UmVzQ291bnQ7CiAgCgojaWZkZWYgV0xBTl9TT0ZUQVBfRkxPV0NUUkxfRU4KICAvKiBGSVhNRTogZGlzYWJsZWQgc2luY2UgY3JlYXRpbmcgaXNzdWVzIGluIHBvd2VyLXNhdmUsIG5lZWRzIHRvIGJlIGFkZHJlc3NlZCAqLyAKICBwVExDYi0+c2VuZEZDRnJhbWUgKys7CiAgcE1hYyA9IHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1dEQSwgcHZvc0dDdHgpOwogIHN5c3RlbVJvbGUgPSB3ZGFHZXRHbG9iYWxTeXN0ZW1Sb2xlKHBNYWMpOwogIGlmIChlU1lTVEVNX0FQX1JPTEUgPT0gc3lzdGVtUm9sZSkKICB7CiAgICAgaWYgKHBUTENiLT5zZW5kRkNGcmFtZSAlIDE2ID09IDApCiAgICAgewogICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgIlRyYW5zbWl0IEZDIikpOwogICAgICAgICBXTEFOVExfVHhGQ0ZyYW1lIChwdm9zR0N0eCk7CiAgICAgfSAKICB9CiNlbmRpZiAvL1dMQU5fU09GVEFQX0ZMT1dDVFJMX0VOIAoKICB1Y0RhdGEgPSAoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19EQVRBICk7CiAgdWNCQVAgID0gKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfQkFQICkgJiYKICAgICAgICAgICAoIE5VTEwgIT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApOwogIHVjTWdtdCA9ICggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX01GICkgJiYKICAgICAgICAgICAoIE5VTEwgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKTsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOiBFdmFsIFJlc3VtZSB0eCBSZXM6ICVkIERBVEE6ICVkIEJBUDogJWQgTUdNVDogJWQiLAogICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCwgdWNEYXRhLCB1Y0JBUCwgdWNNZ210KSk7CgogIGlmICgoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSAmJgogICAgICAoKCAwICE9IHVjRGF0YSApIHx8ICggMCAhPSB1Y01nbXQgKSB8fCAoIDAgIT0gdWNCQVAgKSApICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJJc3N1aW5nIFhtaXQgc3RhcnQgcmVxdWVzdCB0byBCQUwgZm9yIGF2YWlsIHJlcyBTWU5DIikpOwogICAgdm9zU3RhdHVzID1XREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKICB9CiAgcmV0dXJuIHZvc1N0YXR1czsKfS8qV0xBTlRMX0dldFR4UmVzb3VyY2VzQ0IqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBVdGlsaXR5IGZ1bmN0aW9ucwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIKCiAgREVTQ1JJUFRJT04KICAgIElubGluZSBmdW5jdGlvbiBmb3IgdHJhbnNsYXRpbmcgYW5kIDgwMi4xMSBoZWFkZXIgaW50byBhbiA4MDIuMyBoZWFkZXIuCgogIERFUEVOREVOQ0lFUwoKCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgIHBUTENiOiAgICAgICAgICAgIFRMIGNvbnRyb2wgYmxvY2sKICAgSU4vT1VUIAogICAgdWNTdGFJZDogICAgICAgICAgc3RhdGlvbiBJRC4gSW5jYXNlIG9mIFRETFMsIHRoaXMgcmV0dXJucyBhY3R1YWwgVERMUwogICAgICAgICAgICAgICAgICAgICAgc3RhdGlvbiBJRCB1c2VkCgogICBJTi9PVVQKICAgIHZvc0RhdGFCdWZmOiAgICAgIHZvcyBkYXRhIGJ1ZmZlciwgd2lsbCBjb250YWluIHRoZSBuZXcgaGVhZGVyIG9uIG91dHB1dAoKICAgT1VUCiAgICBwdm9zU3RhdHVzOiAgICAgICBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbgoKICBSRVRVUk4gVkFMVUUKCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgICBPdGhlciBlcnJvciBjb2RlcyBtaWdodCBiZSByZXR1cm5lZCBmcm9tIHRoZSB2b3MgYXBpIHVzZWQgaW4gdGhlIGZ1bmN0aW9uCiAgICBwbGVhc2UgY2hlY2sgdGhvc2UgcmV0dXJuIHZhbHVlcy4KCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIKKAogIHZvc19wa3RfdCogICAgICB2b3NEYXRhQnVmZiwKICBWT1NfU1RBVFVTKiAgICAgcHZvc1N0YXR1cywKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IsCiAgdl9VOF90ICAgICAgICAgICpwdWNTdGFJZCwKICBXTEFOVExfTWV0YUluZm9UeXBlICp0bE1ldGFJbmZvLAogIHZfVThfdCAgICAgICAgICAqdWNXRFNFbmFibGVkLAogIHZfVThfdCAgICAgICAgICAqZXh0cmFIZWFkU3BhY2UKKQp7CiAgV0xBTlRMXzgwMjNIZWFkZXJUeXBlICB3ODAyM0hlYWRlcjsKICBXTEFOVExfODAyMTFIZWFkZXJUeXBlICpwdzgwMjExSGVhZGVyOyAvLyBBbGxvY2F0ZSBhbiBhbGlnbmVkIEJEIGFuZCB0aGVuIGZpbGwgaXQuIAogIFZPU19TVEFUVVMgICAgICAgICAgICAgdm9zU3RhdHVzOwogIHZfVThfdCAgICAgICAgICAgICAgICAgTWFuZGF0b3J5dWNIZWFkZXJTaXplID0gV0xBTjgwMjExX01BTkRBVE9SWV9IRUFERVJfU0laRTsKICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjSGVhZGVyU2l6ZSA9IDA7CiAgdl9WT0lEX3QgICAgICAgICAgICAgICAqcHB2QkRIZWFkZXIgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgcENsaWVudFNUQSA9IE5VTEw7CiAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y1FvU09mZnNldCA9IFdMQU44MDIxMV9NQU5EQVRPUllfSEVBREVSX1NJWkU7CiAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y1N0YUlkOwojaWZkZWYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQKICB2X0JPT0xfdCAgICAgICAgICAgICAgIGJJQVBQVHh3aXRoTExDID0gVk9TX0ZBTFNFOwogIHZfU0laRV90ICAgICAgICAgICAgICAgd0lBUFBTbmFwU2l6ZSA9IFdMQU5UTF9MTENfSEVBREVSX0xFTjsKICB2X1U4X3QgICAgICAgICAgICAgICAgIHdJQVBQU25hcFtXTEFOVExfTExDX0hFQURFUl9MRU5dID0gezB9OwojZW5kaWYKICAqdWNXRFNFbmFibGVkID0gMDsgLy8gZGVmYXVsdCBXRFMgb2ZmLgogIHZvc1N0YXR1cyA9IHZvc19wa3RfcG9wX2hlYWQoIHZvc0RhdGFCdWZmLCAmdzgwMjNIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHc4MDIzSGVhZGVyKSk7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAiV0xBTiBUTDogUGFja2V0IHBvcCBoZWFkZXIgZmFpbHMgb24gV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyIikpOwogICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICBpZiggTlVMTCA9PSBwdWNTdGFJZCApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAiV0xBTiBUTDogSW52YWxpZCBwb2ludGVyIGZvciBTdGFJZCIpKTsKICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KICB1Y1N0YUlkID0gKnB1Y1N0YUlkOwogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKCiAgaWYgKCBXTEFOX1NUQV9JTkZSQSA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXS0+d1NUQURlc2Mud1NUQVR5cGUKICAgICAgJiYgcFRMQ2ItPnVjVGRsc1BlZXJDb3VudCApCiAgewogICAgdl9VOF90IHVjSW5kZXggPSAwOwogICAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOX01BWF9TVEFfQ09VTlQgOyB1Y0luZGV4KyspCiAgICB7CiAgICAgIGlmICggdWNJbmRleCAhPSB1Y1N0YUlkICYmIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdICYmIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdLT51Y0V4aXN0cyAmJgogICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdLT50bFN0YXRlID09IFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCkgJiYKICAgICAgICAgICghcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0tPnVjVHhTdXNwZW5kZWQpICYmCiAgICAgICAgICB2b3NfbWVtX2NvbXBhcmUoICh2b2lkKilwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XS0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MuYnl0ZXMsCiAgICAgICAgICAgICh2b2lkKil3ODAyM0hlYWRlci52REEsIDYpICkKICAgICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAiV0xBTiBUTDogR290IGEgVERMUyBzdGF0aW9uLiBVc2luZyB0aGF0IGluZGV4IikpOwogICAgICAgIHVjU3RhSWQgPSB1Y0luZGV4OwogICAgICAgICpwdWNTdGFJZCA9IHVjU3RhSWQ7CiAgICAgICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdOwogICAgICAgIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICAgICAgICB7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQojZW5kaWYKCiNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRAppZiAoKDAgPT0gdzgwMjNIZWFkZXIudXNMZW5UeXBlKSAmJiAocENsaWVudFNUQS0+d1NUQURlc2MudWNJc0VzZVN0YSkpCnsKICAgIHZvc19wa3RfZXh0cmFjdF9kYXRhKHZvc0RhdGFCdWZmLDAsJndJQVBQU25hcFswXSwmd0lBUFBTbmFwU2l6ZSk7CiAgICBpZiAodm9zX21lbV9jb21wYXJlKHdJQVBQU25hcCxXTEFOVExfQUlST05FVF9TTkFQX0hFQURFUixXTEFOVExfTExDX0hFQURFUl9MRU4pKQogICAgewogICAgICAgIC8qVGhlIFNOQVAgYW5kIHRoZSBwcm90b2NvbCB0eXBlIGFyZSBhbHJlYWR5IGluIHRoZSBkYXRhIGJ1ZmZlci4KICAgICAgICAgVGhleSBhcmUgZmlsbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAod3BhX3N1cHBsaWNhbnQpLiBTbywgU2tpcCBBZGRpbmcgTExDIGJlbG93LiovCiAgICAgICAgIGJJQVBQVHh3aXRoTExDID0gVk9TX1RSVUU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgYklBUFBUeHdpdGhMTEMgPSBWT1NfRkFMU0U7CiAgICB9Cn0KI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCgogIGlmICgoMCAhPSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0FkZFJtdkxMQykKI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FECiAgICAgICYmICghYklBUFBUeHdpdGhMTEMpCiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLwogICAgICkKICB7CiAgICAvKiBQdXNoIHRoZSBsZW5ndGggKi8KICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICZ3ODAyM0hlYWRlci51c0xlblR5cGUsIHNpemVvZih3ODAyM0hlYWRlci51c0xlblR5cGUpKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogUGFja2V0IHB1c2ggZXRoZXIgdHlwZSBmYWlscyBvbiIKICAgICAgICAgICAgICAgICAgIiBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIiKSk7CiAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQoKI2lmZGVmIEJUQU1QX1RFU1QKICAgIC8vIFRoZSBTVEEgc2lkZSB3aWxsIGV4ZWN1dGUgdGhpcywgYSBoYWNrIHRvIHRlc3QgQlRBTVAgYnkgdXNpbmcgdGhlCiAgICAvLyBpbmZyYSBzZXR1cC4gT24gcmVhbCBCVEFNUCB0aGlzIHdpbGwgY29tZSBmcm9tIEJBUCBpdHNlbGYuCiAgICB7CiAgICBzdGF0aWMgdl9VOF90IFdMQU5UTF9CVF9BTVBfTExDX0hFQURFUltdID0gIHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDE5LCAweDU4IH07CiAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3B1c2hfaGVhZCh2b3NEYXRhQnVmZiwgV0xBTlRMX0JUX0FNUF9MTENfSEVBREVSLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihXTEFOVExfQlRfQU1QX0xMQ19IRUFERVIpKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOiBQYWNrZXQgcHVzaCBMTEMgaGVhZGVyIGZhaWxzIG9uIgogICAgICAgICAgICAgICAgICAiIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciIpKTsKICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CiAgICB9CiNlbHNlCiAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3B1c2hfaGVhZCh2b3NEYXRhQnVmZiwgV0xBTlRMX0xMQ19IRUFERVIsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdMQU5UTF9MTENfSEVBREVSKSk7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDogUGFja2V0IHB1c2ggTExDIGhlYWRlciBmYWlscyBvbiIKICAgICAgICAgICAgICAgICAgIiBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIiKSk7CiAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQojZW5kaWYKICB9LypJZiBhZGQgTExDIGlzIGVuYWJsZWQqLwogIGVsc2UKICB7CiNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRAogICAgICBiSUFQUFR4d2l0aExMQyA9IFZPU19GQUxTRTsgLypSZXNldCB0aGUgRmxhZyBoZXJlIHRvIHN0YXJ0IGFmcmVzaCB3aXRoIHRoZSBuZXh0IFRYIHBrdCovCiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLwogICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDogU1RBIENsaWVudCByZWdpc3RlcmVkIHRvIG5vdCByZW1vdmUgTExDIgogICAgICAgICAgICAgICAgICAiIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciIpKTsKICB9CgojaWZkZWYgQlRBTVBfVEVTVAogIHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlID0gV0xBTl9TVEFfQlRfQU1QOwojZW5kaWYKCiAgLy8gRmluZCB0aGUgc3BhY2UgcmVxdWlyZWQgZm9yIHRoZSA4MDIuMTEgaGVhZGVyIGZvcm1hdAogIC8vIGJhc2VkIG9uIHRoZSBmcmFtZSBjb250cm9sIGZpZWxkcy4KICB1Y0hlYWRlclNpemUgPSBNYW5kYXRvcnl1Y0hlYWRlclNpemU7CiAgaWYgKHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCkKICB7ICAKICAgIHVjSGVhZGVyU2l6ZSArPSBzaXplb2YocHc4MDIxMUhlYWRlci0+dXNRb3NDdHJsKTsKICB9CiAgaWYgKHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlID09IFdMQU5fU1RBX0JUX0FNUCkKICB7ICAKICAgIHVjSGVhZGVyU2l6ZSArPSBzaXplb2YocHc4MDIxMUhlYWRlci0+b3B0dkE0KTsKICAgIHVjUW9TT2Zmc2V0ICs9IHNpemVvZihwdzgwMjExSGVhZGVyLT5vcHR2QTQpOwogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgIiBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIgOiBIZWFkZXIgc2l6ZSA9ICVkICIsIHVjSGVhZGVyU2l6ZSkpOwoKICB2b3NfcGt0X3Jlc2VydmVfaGVhZCggdm9zRGF0YUJ1ZmYsICZwcHZCREhlYWRlciwgdWNIZWFkZXJTaXplICk7CiAgaWYgKCBOVUxMID09IHBwdkJESGVhZGVyICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpWT1NTIHBhY2tldCBjb3JydXB0ZWQgIikpOwogICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICByZXR1cm4gKnB2b3NTdGF0dXM7CiAgfQoKCiAgLy8gT0sgbm93IHdlIGhhdmUgdGhlIHNwYWNlLiBGaWxsIHRoZSA4MDIxMSBoZWFkZXIKICAvKiBGaWxsIEEyICovCiAgcHc4MDIxMUhlYWRlciA9IChXTEFOVExfODAyMTFIZWFkZXJUeXBlICopKHBwdkJESGVhZGVyKTsKICAvLyBvbmx5IGNsZWFyIHRoZSByZXF1aXJlZCBzcGFjZS4KICB2b3NfbWVtX3NldCggcHc4MDIxMUhlYWRlciwgdWNIZWFkZXJTaXplLCAwICk7CiAgdm9zX21lbV9jb3B5KCBwdzgwMjExSGVhZGVyLT52QTIsIHc4MDIzSGVhZGVyLnZTQSwgIFZPU19NQUNfQUREUl9TSVpFKTsKCgojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICBpZiAoKCBXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQgPT0gcENsaWVudFNUQS0+dGxTdGF0ZSB8fAogICAgICAgIHBDbGllbnRTVEEtPnB0a0luc3RhbGxlZCApICYmIGdVY0lzV2FpICE9IDEpCiNlbHNlCiAgaWYgKCBXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQgPT0gcENsaWVudFNUQS0+dGxTdGF0ZSB8fAogICAgICAgcENsaWVudFNUQS0+cHRrSW5zdGFsbGVkICkKI2VuZGlmCiAgewogICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwud2VwID0KICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Byb3RlY3RlZEZyYW1lOwogIH0KCiAgcHc4MDIxMUhlYWRlci0+dXNEdXJhdGlvbklkID0gMDsKICBwdzgwMjExSGVhZGVyLT51c1NlcUN0cmwgICAgPSAwOwoKICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC50eXBlICAgICA9IFdMQU5UTF84MDIxMV9EQVRBX1RZUEU7CgoKCiAgaWYocENsaWVudFNUQS0+d1NUQURlc2MudWNRb3NFbmFibGVkKQogIHsKICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwuc3ViVHlwZSAgPSBXTEFOVExfODAyMTFfREFUQV9RT1NfU1VCVFlQRTsKCiAgICAgICooKHZfVTE2X3QgKikoKHZfVThfdCAqKXBwdkJESGVhZGVyICsgdWNRb1NPZmZzZXQpKSA9IHRsTWV0YUluZm8tPnVjVVA7CgogIH0KICBlbHNlCiAgewogICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5zdWJUeXBlICA9IDA7CgogIC8vIE5PIE5PIE5PIC0gdGhlcmUgaXMgbm90IGVub3VnaCBtZW1vcnkgYWxsb2NhdGVkIHRvIHdyaXRlIHRoZSBRT1MgY3RybCAgCiAgLy8gZmllbGQsIGl0IHdpbGwgb3ZlcndyaXRlIHRoZSBmaXJzdCAyIGJ5dGVzIG9mIHRoZSBkYXRhIHBhY2tldChMTEMgaGVhZGVyKQogIC8vIHB3ODAyMTFIZWFkZXItPnVzUW9zQ3RybCAgICAgICAgID0gMDsKICB9CgoKICBzd2l0Y2goIHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlICkKICB7CiAgICAgY2FzZSBXTEFOX1NUQV9JQlNTOgogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnRvRFMgICAgICAgICAgPSAwOwogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLmZyb21EUyAgICAgICAgPSAwOwoKICAgICAgICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QqKSZwdzgwMjExSGVhZGVyLT52QTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfTUFDQUREUl90KikmdzgwMjNIZWFkZXIudkRBKTsKICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMywKICAgICAgICAgICAgICAmcENsaWVudFNUQS0+d1NUQURlc2MudkJTU0lEZm9ySUJTUyAsCiAgICAgICAgICAgICAgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICAgIGJyZWFrOwoKICAgICBjYXNlIFdMQU5fU1RBX0JUX0FNUDoKICAgICAgICAqdWNXRFNFbmFibGVkID0gMTsgLy8gV0RTIG9uLgogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnRvRFMgICAgICAgICAgPSAxOwogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLmZyb21EUyAgICAgICAgPSAxOwogICAgICAgIHZvc19jb3B5X21hY2FkZHIoICh2X01BQ0FERFJfdCopJnB3ODAyMTFIZWFkZXItPnZBMSwKICAgICAgICAgICAgICAmcENsaWVudFNUQS0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MpOwogICAgICAgIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkEyLAogICAgICAgICAgICAgIHc4MDIzSGVhZGVyLnZTQSwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICAgIHZvc19jb3B5X21hY2FkZHIoICh2X01BQ0FERFJfdCopJnB3ODAyMTFIZWFkZXItPnZBMywKICAgICAgICAgICAgICAmcENsaWVudFNUQS0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MpOwogICAgICAgIC8qIGZpbGwgdGhlIG9wdGlvbmFsIEE0IGhlYWRlciAqLwogICAgICAgIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+b3B0dkE0LAogICAgICAgICAgICAgIHc4MDIzSGVhZGVyLnZTQSwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIkJUQU1QIENBU0UgTk9XIC0tLS0tLS0tLXN0YWlkPSVkIiwKICAgICAgICAgICAgICAgICB1Y1N0YUlkKSk7CiAgICAgICAgYnJlYWs7CgogICAgIGNhc2UgV0xBTl9TVEFfU09GVEFQOgogICAgICAgICp1Y1dEU0VuYWJsZWQgPSAwOyAvLyBXRFMgb2ZmLgogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnRvRFMgICAgICAgICAgPSAwOwogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLmZyb21EUyAgICAgICAgPSAxOwogICAgICAgIC8qQ29weSB0aGUgREEgdG8gQTEqLwogICAgICAgIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkExLCB3ODAyM0hlYWRlci52REEgLCBWT1NfTUFDX0FERFJfU0laRSk7ICAgCiAgICAgICAgdm9zX2NvcHlfbWFjYWRkciggKHZfTUFDQUREUl90KikmcHc4MDIxMUhlYWRlci0+dkEyLAogICAgICAgICAgICAgICZwQ2xpZW50U1RBLT53U1RBRGVzYy52U2VsZk1BQ0FkZHJlc3MpOwogICAgICAgIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkEzLAogICAgICAgICAgICAgIHc4MDIzSGVhZGVyLnZTQSwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgInN3IDgwMiB0byA4MDIxMSBzb2Z0YXAgY2FzZSAgLS0tLS0tLS0tc3RhaWQ9JWQiLAogICAgICAgICAgICAgICAgIHVjU3RhSWQpKTsKICAgICAgICBicmVhazsKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgICAgY2FzZSBXTEFOX1NUQV9URExTOgogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnRvRFMgICAgICAgICAgPSAwOwogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLmZyb21EUyAgICAgICAgPSAwOwogICAgICAgIC8qRml4IG1lKi8KICAgICAgICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QqKSZwdzgwMjExSGVhZGVyLT52QTEsCiAgICAgICAgICAgICAgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzKTsKICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMywKICAgICAgICAgICAgICAmcENsaWVudFNUQS0+d1NUQURlc2MudkJTU0lEZm9ySUJTUyAsCiAgICAgICAgICAgICAgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAoIlRMOlRETFMgQ0FTRSBOT1cgLS0tLS0tLS0tc3RhaWQ9JWQiKSwgdWNTdGFJZCk7CiAgICAgICAgYnJlYWs7CiNlbmRpZgogICAgIGNhc2UgV0xBTl9TVEFfSU5GUkE6CiAgICAgZGVmYXVsdDoKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC50b0RTICAgICAgICAgID0gMTsKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5mcm9tRFMgICAgICAgID0gMDsKICAgICAgICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QqKSZwdzgwMjExSGVhZGVyLT52QTEsCiAgICAgICAgICAgICAgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzKTsKICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMywgdzgwMjNIZWFkZXIudkRBICwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIlJFR1VMQVIgSU5GUkEgTElOSyBDQVNFLS0tLS0tLS0tc3RhaWQ9JWQiLAogICAgICAgICAgICAgICAgIHVjU3RhSWQpKTsKICAgICAgICBicmVhazsKICB9CiAgLy8gT0sgbm93IHdlIGhhdmUgdGhlIHNwYWNlLiBGaWxsIHRoZSA4MDIxMSBoZWFkZXIKICAvKiBGaWxsIEEyICovCiAgcHc4MDIxMUhlYWRlciA9IChXTEFOVExfODAyMTFIZWFkZXJUeXBlICopKHBwdkJESGVhZGVyKTsKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LypXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgQkVHSU4gTE9HIEZVTkNUSU9OICAgICEhISBSZW1vdmUgbWUgb3IgY2xlYW4gbWUKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwojaWYgMCAvL2RlZiBXTEFOVExfREVCVUcKCiNkZWZpbmUgV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkUgICAgMTYKI2RlZmluZSBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURSAgICA0CgpzdGF0aWMgdl9WT0lEX3QgV0xBTlRMX0RlYnVnRnJhbWUKKAogICB2X1BWT0lEX3QgICBkYXRhUG9pbnRlciwKICAgdl9VMzJfdCAgICAgZGF0YVNpemUKKQp7CiAgIHZfVThfdCAgIGxpbmVCdWZmZXJbV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkVdOwogICB2X1UzMl90ICBudW1MaW5lczsKICAgdl9VMzJfdCAgbnVtQnl0ZXM7CiAgIHZfVTMyX3QgIGlkeDsKICAgdl9VOF90ICAgKmxpbmVQb2ludGVyOwoKICAgbnVtTGluZXMgPSBkYXRhU2l6ZSAvIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FOwogICBudW1CeXRlcyA9IGRhdGFTaXplICUgV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkU7CiAgIGxpbmVQb2ludGVyID0gKHZfVThfdCAqKWRhdGFQb2ludGVyOwoKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NBTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiV0xBTiBUTDpGcmFtZSBEZWJ1ZyBGcmFtZSBTaXplICVkLCBQb2ludGVyIDB4JXAiLCBkYXRhU2l6ZSwgZGF0YVBvaW50ZXIpKTsKICAgZm9yKGlkeCA9IDA7IGlkeCA8IG51bUxpbmVzOyBpZHgrKykKICAgewogICAgICBtZW1zZXQobGluZUJ1ZmZlciwgMCwgV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkUpOwogICAgICBtZW1jcHkobGluZUJ1ZmZlciwgbGluZVBvaW50ZXIsIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FKTsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NBTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6MHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMngiLAogICAgICAgICAgICAgICAgIGxpbmVCdWZmZXJbMF0sIGxpbmVCdWZmZXJbMV0sIGxpbmVCdWZmZXJbMl0sIGxpbmVCdWZmZXJbM10sIGxpbmVCdWZmZXJbNF0sIGxpbmVCdWZmZXJbNV0sIGxpbmVCdWZmZXJbNl0sIGxpbmVCdWZmZXJbN10sCiAgICAgICAgICAgICAgICAgbGluZUJ1ZmZlcls4XSwgbGluZUJ1ZmZlcls5XSwgbGluZUJ1ZmZlclsxMF0sIGxpbmVCdWZmZXJbMTFdLCBsaW5lQnVmZmVyWzEyXSwgbGluZUJ1ZmZlclsxM10sIGxpbmVCdWZmZXJbMTRdLCBsaW5lQnVmZmVyWzE1XSkpOwogICAgICBsaW5lUG9pbnRlciArPSBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORTsKICAgfQoKICAgaWYoMCA9PSBudW1CeXRlcykKICAgICAgcmV0dXJuOwoKICAgbWVtc2V0KGxpbmVCdWZmZXIsIDAsIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FKTsKICAgbWVtY3B5KGxpbmVCdWZmZXIsIGxpbmVQb2ludGVyLCBudW1CeXRlcyk7CiAgIGZvcihpZHggPSAwOyBpZHggPCBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORSAvIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFOyBpZHgrKykKICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU0FMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOIFRMOjB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IiwKICAgICAgICAgICAgICAgIGxpbmVCdWZmZXJbaWR4ICogV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0JZVEVdLCBsaW5lQnVmZmVyWzEgKyBpZHggKiBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURV0sCiAgICAgICAgICAgICAgICBsaW5lQnVmZmVyWzIgKyBpZHggKiBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURV0sIGxpbmVCdWZmZXJbMyArIGlkeCAqIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFXSkpOwogICAgICBpZigoKGlkeCArIDEpICogV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0JZVEUpID49IG51bUJ5dGVzKQogICAgICAgICBicmVhazsKICAgfQoKICAgcmV0dXJuOwp9CiNlbmRpZgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBFTkQgTE9HIEZVTkNUSU9OCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfVHJhbnNsYXRlODAyMTFUbzgwMjNIZWFkZXIKCiAgREVTQ1JJUFRJT04KICAgIElubGluZSBmdW5jdGlvbiBmb3IgdHJhbnNsYXRpbmcgYW5kIDgwMi4xMSBoZWFkZXIgaW50byBhbiA4MDIuMyBoZWFkZXIuCgogIERFUEVOREVOQ0lFUwoKCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgIHBUTENiOiAgICAgICAgICAgIFRMIGNvbnRyb2wgYmxvY2sKICAgIHVjU3RhSWQ6ICAgICAgICAgIHN0YXRpb24gSUQKICAgIHVjSGVhZGVyTGVuOiAgICAgIExlbmd0aCBvZiB0aGUgaGVhZGVyIGZyb20gQkQKICAgIHVjQWN0dWFsSExlbjogICAgIExlbmd0aCBvZiBoZWFkZXIgaW5jbHVkaW5nIHBhZGRpbmcgb3IgYW55IG90aGVyIHRyYWlsZXJzCgogICBJTi9PVVQKICAgIHZvc0RhdGFCdWZmOiAgICAgIHZvcyBkYXRhIGJ1ZmZlciwgd2lsbCBjb250YWluIHRoZSBuZXcgaGVhZGVyIG9uIG91dHB1dAoKICAgT1VUCiAgICBwdm9zU3RhdHVzOiAgICAgICBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbgoKICAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlcgooCiAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmLAogIFZPU19TVEFUVVMqICAgICBwdm9zU3RhdHVzLAogIHZfVTE2X3QgICAgICAgICB1c0FjdHVhbEhMZW4sCiAgdl9VOF90ICAgICAgICAgIHVjSGVhZGVyTGVuLAogIFdMQU5UTF9DYlR5cGUqICBwVExDYiwKICB2X1U4X3QgICAgICAgICAgdWNTVEFJZCwKICB2X0JPT0xfdCAgICAgICAgYkZvcndhcmRJQVBQd2l0aExMQwopCnsKICBXTEFOVExfODAyM0hlYWRlclR5cGUgIHc4MDIzSGVhZGVyOwogIFdMQU5UTF84MDIxMUhlYWRlclR5cGUgdzgwMjExSGVhZGVyOwogIHZfVThfdCAgICAgICAgICAgICAgICAgYXVjTExDSGVhZGVyW1dMQU5UTF9MTENfSEVBREVSX0xFTl07CiAgVk9TX1NUQVRVUyAgICAgICAgICAgICB2b3NTdGF0dXM7CiAgdl9VMTZfdCAgICAgICAgICAgICAgICB1c0RhdGFTdGFydE9mZnNldCA9IDA7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIGlmICggc2l6ZW9mKHc4MDIxMUhlYWRlcikgPCB1Y0hlYWRlckxlbiApCiAgewogICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAiV2FybmluZyAhOiBDaGVjayB0aGUgaGVhZGVyIHNpemUgZm9yIHRoZSBSeCBmcmFtZSBzdHJ1Y3R1cmU9JWQgcmVjZWl2ZWQ9JWRuIiwKICAgICAgIHNpemVvZih3ODAyMTFIZWFkZXIpLCB1Y0hlYWRlckxlbikpOwogICAgIHVjSGVhZGVyTGVuID0gc2l6ZW9mKHc4MDIxMUhlYWRlcik7CiAgfQoKICAvLyBUaGlzIHdpbGwgdGFrZSBjYXJlIG9mIGhlYWRlcnMgb2YgYWxsIHNpemVzLCAzIGFkZHJlc3MsIDMgYWRkciBRT1MsCiAgLy8gV0RTIG5vbi1RT1MgYW5kIFdEUyBRb1MgZXRjLiBXZSBoYXZlIHNwYWNlIGZvciBhbGwgaW4gdGhlIDgwMi4xMSBoZWFkZXIgc3RydWN0dXJlLgogIHZvc1N0YXR1cyA9IHZvc19wa3RfcG9wX2hlYWQoIHZvc0RhdGFCdWZmLCAmdzgwMjExSGVhZGVyLCB1Y0hlYWRlckxlbik7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGYWlsZWQgdG8gcG9wIDgwMjExIGhlYWRlciBmcm9tIHBhY2tldCAlZCIsCiAgICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKCiAgICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIHN3aXRjaCAoIHc4MDIxMUhlYWRlci53RnJtQ3RybC5mcm9tRFMgKQogIHsKICBjYXNlIDA6CiAgICBpZiAoIHc4MDIxMUhlYWRlci53RnJtQ3RybC50b0RTICkKICAgIHsKICAgICAgLy9Tb2Z0QVAgQVAgbW9kZQogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZEQSwgdzgwMjExSGVhZGVyLnZBMywgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZTQSwgdzgwMjExSGVhZGVyLnZBMiwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAiV0xBTiBUTCBTb2Z0QVA6IDgwMiAzIERBICUwOHggU0EgJTA4eCIsCiAgICAgICAgICAgICAgICAgIHc4MDIzSGVhZGVyLnZEQSwgdzgwMjNIZWFkZXIudlNBKSk7CiAgICB9CiAgICBlbHNlIAogICAgewogICAgICAvKiBJQlNTICovCiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudkRBLCB3ODAyMTFIZWFkZXIudkExLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudlNBLCB3ODAyMTFIZWFkZXIudkEyLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICB9CiAgICBicmVhazsKICBjYXNlIDE6CiAgICBpZiAoIHc4MDIxMUhlYWRlci53RnJtQ3RybC50b0RTICkKICAgIHsKICAgICAgLyogQlQtQU1QIGNhc2UgKi8KICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52REEsIHc4MDIxMUhlYWRlci52QTEsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52U0EsIHc4MDIxMUhlYWRlci52QTIsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgIH0KICAgIGVsc2UKICAgIHsgLyogSW5mcmEgKi8KICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52REEsIHc4MDIxMUhlYWRlci52QTEsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52U0EsIHc4MDIxMUhlYWRlci52QTMsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgIH0KICAgIGJyZWFrOwogIH0KCiAgaWYoIHVzQWN0dWFsSExlbiA+IHVjSGVhZGVyTGVuICkKICB7CiAgICAgdXNEYXRhU3RhcnRPZmZzZXQgPSB1c0FjdHVhbEhMZW4gLSB1Y0hlYWRlckxlbjsKICB9CgogIGlmICggMCA8IHVzRGF0YVN0YXJ0T2Zmc2V0ICkKICB7CiAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3RyaW1faGVhZCggdm9zRGF0YUJ1ZmYsIHVzRGF0YVN0YXJ0T2Zmc2V0ICk7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIHRyaW0gaGVhZGVyIGZyb20gcGFja2V0ICVkIiwKICAgICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CiAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+d1NUQURlc2MudWNBZGRSbXZMTEMKI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FECiAgICAmJiAoIWJGb3J3YXJkSUFQUHdpdGhMTEMpCiNlbmRpZiAvKiAgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KICAgICApCiAgewogICAgLy8gRXh0cmFjdCB0aGUgTExDIGhlYWRlcgogICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wb3BfaGVhZCggdm9zRGF0YUJ1ZmYsIGF1Y0xMQ0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9MTENfSEVBREVSX0xFTik7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIHBvcCBMTEMgaGVhZGVyIGZyb20gcGFja2V0ICVkIiwKICAgICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CgogICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KCiAgICAvL0V4dHJhY3QgdGhlIGxlbmd0aAogICAgdm9zX21lbV9jb3B5KCZ3ODAyM0hlYWRlci51c0xlblR5cGUsCiAgICAgICZhdWNMTENIZWFkZXJbV0xBTlRMX0xMQ19IRUFERVJfTEVOIC0gc2l6ZW9mKHc4MDIzSGVhZGVyLnVzTGVuVHlwZSldLAogICAgICBzaXplb2YodzgwMjNIZWFkZXIudXNMZW5UeXBlKSApOwogIH0KICBlbHNlCiAgewogICAgdm9zU3RhdHVzID0gdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCh2b3NEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3ODAyM0hlYWRlci51c0xlblR5cGUpOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGYWlsZWQgdG8gZ2V0IHBhY2tldCBsZW5ndGggJWQiLAogICAgICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKCiAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgIldMQU4gVEw6IEJUQU1QIGxlbiAoZXRoZXJ0eXBlKSBmbGQgPSAlZCIsCiAgICAgICAgdzgwMjNIZWFkZXIudXNMZW5UeXBlKSk7CiAgICB3ODAyM0hlYWRlci51c0xlblR5cGUgPSB2b3NfY3B1X3RvX2JlMTYodzgwMjNIZWFkZXIudXNMZW5UeXBlKTsKICB9CgogIHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLCAmdzgwMjNIZWFkZXIsIHNpemVvZih3ODAyM0hlYWRlcikpOwoKI2lmZGVmIEJUQU1QX1RFU1QKICB7CiAgLy8gQVAgc2lkZSB3aWxsIGV4ZWN1dGUgdGhpcy4KICB2X1U4X3QgKnRlbXBfdzgwMjNIZWFkZXIgPSBOVUxMOwogIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCB2b3NEYXRhQnVmZiwgMCwKICAgICZ0ZW1wX3c4MDIzSGVhZGVyLCBzaXplb2YodzgwMjNIZWFkZXIpICk7CiAgfQojZW5kaWYKI2lmIDAgLypUTF9ERUJVRyovCiAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCh2b3NEYXRhQnVmZiwgJnVzTGVuKTsKICB2b3NfcGt0X3BvcF9oZWFkKCB2b3NEYXRhQnVmZiwgYXVjRGF0YSwgdXNMZW4pOwoKICBXTEFOVExfRGVidWdGcmFtZShhdWNEYXRhLCB1c0xlbik7CgogIHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLCBhdWNEYXRhLCB1c0xlbik7CgojZW5kaWYKCiAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKldMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlciovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX0ZpbmRGcmFtZVR5cGVCY01jVWMKCiAgREVTQ1JJUFRJT04KICAgIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCB3aGV0aGVyIHJlY2VpdmVkIGZyYW1lIGlzIGJyb2FkY2FzdCwgbXVsdGljYXN0CiAgICBvciB1bmljYXN0LgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcFRMQ2I6ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFRMJ3MgY29udHJvbCBibG9jawogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgIHBvaW50ZXIgdG8gdGhlIHZvcyBidWZmZXIKCiAgIElOL09VVAogICAgcHVjQmNNY1VjOiAgICAgICBwb2ludGVyIHRvIGJ1ZmZlciwgd2lsbCBjb250YWluIGZyYW1lIHR5cGUgb24gcmV0dXJuCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICBWT1NfU1RBVFVTX0VfQkFETVNHOiAgZmFpbGVkIHRvIGV4dHJhY3QgaW5mbyBmcm9tIGRhdGEgYnVmZmVyCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgc3VjY2VzcwoKICBTSURFIEVGRkVDVFMKICAgIE5vbmUuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjCigKICBXTEFOVExfQ2JUeXBlICpwVExDYiwKICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90ICAgICAqdm9zRGF0YUJ1ZmYsCiAgdl9VOF90ICAgICAgICAqcHVjQmNNY1VjCikKewogICBWT1NfU1RBVFVTICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgdl9QVk9JRF90ICAgICBhdWNCREhlYWRlcjsKICAgdl9QVk9JRF90ICAgICBwdlBlZWtEYXRhOwogICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgU2FuaXR5IGNoZWNrCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICBpZiAoKE5VTEwgPT0gcFRMQ2IpIHx8IAogICAgICAgKE5VTEwgPT0gdm9zRGF0YUJ1ZmYpIHx8IAogICAgICAgKE5VTEwgPT0gcHVjQmNNY1VjKSkKICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIGluIFdMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjIikpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogICB9CgogICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgIH0KCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgRXh0cmFjdCBCRCBoZWFkZXIgYW5kIGNoZWNrIGlmIHZhbGlkCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICB2b3NTdGF0dXMgPSBXREFfRFNfUGVla1J4UGFja2V0SW5mbyh2b3NEYXRhQnVmZiwgKHZfUFZPSURfdCkmYXVjQkRIZWFkZXIsIDAvKlN3YXAgQkQqLyApOwoKICAgaWYgKE5VTEwgPT0gYXVjQkRIZWFkZXIpCiAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfRmluZEZyYW1lVHlwZUJjTWNVYyAtIENhbm5vdCBleHRyYWN0IEJEIGhlYWRlciIpKTsKICAgICAgVk9TX0FTU0VSVCgwKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9CQURNU0c7CiAgIH0KCiAgIGlmICgoMCA9PSBXREFfR0VUX1JYX0ZUX0RPTkUoYXVjQkRIZWFkZXIpKSAmJgogICAgICAgKDAgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndTVEFEZXNjLnVjU3dGcmFtZVJYWGxhdGlvbikpCiAgIHsKICAgICAgLyogSXRzIGFuIDgwMi4xMSBmcmFtZSwgZXh0cmFjdCBNQUMgYWRkcmVzcyAxICovCiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjIC0gODAyLjExIGZyYW1lLCBwZWVraW5nIEFkZHIxIikpOwogICAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BlZWtfZGF0YSh2b3NEYXRhQnVmZiwgV0xBTlRMX01BQ19BRERSX0FMSUdOKDEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcHZQZWVrRGF0YSwgVk9TX01BQ19BRERSX1NJWkUpOwogICB9CiAgIGVsc2UKICAgewogICAgICAvKiBJdHMgYW4gODAyLjMgZnJhbWUsIGV4dHJhY3QgRGVzdGluYXRpb24gTUFDIGFkZHJlc3MgKi8KICAgICAgVExMT0cyKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6V0xBTlRMX0ZpbmRGcmFtZVR5cGVCY01jVWMgLSA4MDIuMyBmcmFtZSwgcGVla2luZyBEQSIpKTsKICAgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEodm9zRGF0YUJ1ZmYsIFdMQU5UTF9NQUNfQUREUl9BTElHTigwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcHZQZWVrRGF0YSwgVk9TX01BQ19BRERSX1NJWkUpOwogICB9CgogICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykgCiAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfRmluZEZyYW1lVHlwZUJjTWNVYyAtIEZhaWxlZCB0byBwZWVrIE1BQyBhZGRyZXNzIikpOwogICAgICByZXR1cm4gdm9zU3RhdHVzOwogICB9CgogICBpZiAoKCh0QU5JX1U4ICopcHZQZWVrRGF0YSlbMF0gPT0gMHhmZikKICAgewogICAgICAqcHVjQmNNY1VjID0gV0xBTlRMX0ZSQU1FX1RZUEVfQkNBU1Q7CiAgIH0KICAgZWxzZQogICB7CiAgICAgIGlmICgoKCh0QU5JX1U4ICopcHZQZWVrRGF0YSlbMF0gJiAweDAxKSA9PSAweDAxKQogICAgICAgICAqcHVjQmNNY1VjID0gV0xBTlRMX0ZSQU1FX1RZUEVfTUNBU1Q7CiAgICAgIGVsc2UKICAgICAgICAgKnB1Y0JjTWNVYyA9IFdMQU5UTF9GUkFNRV9UWVBFX1VDQVNUOwogICB9CgogICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfRmluZEZyYW1lVHlwZUJjTWNVYyAtIEFkZHIxQnl0ZTEgaXM6ICV4IiwgCiAgICAgICAgICAoKHRBTklfVTggKilwdlBlZWtEYXRhKVswXSkpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgojaWYgMAojaWZkZWYgV0xBTl9QRVJGIAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX0Zhc3RId0Z3ZERhdGFGcmFtZQoKICBERVNDUklQVElPTiAKICAgIEZhc3QgcGF0aCBmdW5jdGlvbiB0byBxdWlja2x5IGZvcndhcmQgYSBkYXRhIGZyYW1lIGlmIEhBTCBkZXRlcm1pbmVzIEJEIAogICAgc2lnbmF0dXJlIGNvbXB1dGVkIGhlcmUgbWF0Y2hlcyB0aGUgc2lnbmF0dXJlIGluc2lkZSBjdXJyZW50IFZPU1MgcGFja2V0LiAKICAgIElmIHRoZXJlIGlzIGEgbWF0Y2gsIEhBTCBhbmQgVEwgZmlsbHMgaW4gdGhlIHN3YXBwZWQgcGFja2V0IGxlbmd0aCBpbnRvIAogICAgQkQgaGVhZGVyIGFuZCBEeEUgaGVhZGVyLCByZXNwZWN0aXZlbHkuIE90aGVyd2lzZSwgcGFja2V0IGdvZXMgYmFjayB0byAKICAgIG5vcm1hbCAoc2xvdykgcGF0aCBhbmQgYSBuZXcgQkQgc2lnbmF0dXJlIHdvdWxkIGJlIHRhZ2dlZCBpbnRvIEJEIGluIHRoaXMKICAgIFZPU1MgcGFja2V0IGxhdGVyIGJ5IHRoZSBXTEFOSEFMX0ZpbGxUeEJkKCkgZnVuY3Rpb24uCgogIERFUEVOREVOQ0lFUyAKICAgICAKICBQQVJBTUVURVJTIAoKICAgSU4KICAgICAgICBwdm9zR0N0eCAgICBWT1MgY29udGV4dAogICAgICAgIHZvc0RhdGFCdWZmIFB0ciB0byBWT1NTIHBhY2tldAogICAgICAgIHBNZXRhSW5mbyAgIEZvciBnZXR0aW5nIGZyYW1lJ3MgVElECiAgICAgICAgcFN0YUluZm8gICAgRm9yIGNoZWNraW5nIFNUQSB0eXBlCiAgICAKICAgT1VUCiAgICAgICAgcHZvc1N0YXR1cyAgcmV0dXJuZWQgc3RhdHVzCiAgICAgICAgcHVGYXN0RndkT0sgRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIGZyYW1lIGNvdWxkIGJlIGZhc3QgZm9yd2FyZGVkCiAgIAogIFJFVFVSTiBWQUxVRQogICAgTm8gcmV0dXJuLiAgIAoKICBTSURFIEVGRkVDVFMgCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpzdGF0aWMgdm9pZApXTEFOVExfRmFzdEh3RndkRGF0YUZyYW1lCiggCiAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgIHZvc0RhdGFCdWZmLAogIFZPU19TVEFUVVMqICAgcHZvc1N0YXR1cywKICB2X1UzMl90KiAgICAgICBwdUZhc3RGd2RPSywKICBXTEFOVExfTWV0YUluZm9UeXBlKiAgcE1ldGFJbmZvLAogIFdMQU5fU1RBRGVzY1R5cGUqICBwU3RhSW5mbwogCikKewogICAgdl9QVk9JRF90ICAgcHZQZWVrRGF0YTsKICAgIHZfVThfdCAgICAgIHVjRHhFQkRXTEFOSGVhZGVyTGVuID0gV0xBTlRMX0JEX0hFQURFUl9MRU4oMCkgKyBzaXplb2YoV0xBTkJBTF9zRFhFSGVhZGVyVHlwZSk7IAogICAgdl9VOF90ICAgICAgdWNJc1VuaWNhc3Q7CiAgICBXTEFOQkFMX3NEWEVIZWFkZXJUeXBlICAqcER4RUhlYWRlcjsKICAgIHZfUFZPSURfdCAgIHB2QkRIZWFkZXI7CiAgICB2X1BWT0lEX3QgICBwdWNCdWZmUHRyOwogICAgdl9VMTZfdCAgICAgIHVzUGt0TGVuOwoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBwYWNrZXQgbGVuZ3RoCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCggdm9zRGF0YUJ1ZmYsICZ1c1BrdExlbik7CgogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IE1BQyBhZGRyZXNzCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAqcHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCB2b3NEYXRhQnVmZiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9NQUNfQUREUl9BTElHTigwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnB2UGVla0RhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfTUFDX0FERFJfU0laRSApOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9ICpwdm9zU3RhdHVzICkgCiAgICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGV4dHJhY3QgTUFDIEFkZHIgJWQiLCAKICAgICAgICAgICAgICAgICAgKnB2b3NTdGF0dXMpKTsKICAgICAgICpwdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgICAgcmV0dXJuOwogICAgfQoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVzZXJ2ZSBoZWFkIHJvb20gZm9yIER4RSBoZWFkZXIsIEJELCBhbmQgV0xBTiBoZWFkZXIKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICB2b3NfcGt0X3Jlc2VydmVfaGVhZCggdm9zRGF0YUJ1ZmYsICZwdWNCdWZmUHRyLCAKICAgICAgICAgICAgICAgICAgICAgICAgdWNEeEVCRFdMQU5IZWFkZXJMZW4gKTsKICAgIGlmICggTlVMTCA9PSBwdWNCdWZmUHRyICkKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Tm8gZW5vdWdoIHNwYWNlIGluIFZPU1MgcGFja2V0ICVwIGZvciBEeEUvQkQvV0xBTiBoZWFkZXIiLCB2b3NEYXRhQnVmZikpOwogICAgICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcER4RUhlYWRlciA9IChXTEFOQkFMX3NEWEVIZWFkZXJUeXBlICAqKXB1Y0J1ZmZQdHI7CiAgICBwdkJESGVhZGVyID0gKHZfUFZPSURfdCkgJnBEeEVIZWFkZXJbMV07CgogICAgLyogVU1BIFR4IGFjY2VsZXJhdGlvbiBpcyBlbmFibGVkLiAKICAgICAqIFVNQSB3b3VsZCBoZWxwIGNvbnZlcnQgZnJhbWVzIHRvIDgwMi4xMSwgZmlsbCBwYXJ0aWFsIEJEIGZpZWxkcyBhbmQgCiAgICAgKiBjb25zdHJ1Y3QgTExDIGhlYWRlci4gVG8gZnVydGhlciBhY2NlbGVyYXRlIHRoaXMga2luZCBvZiBmcmFtZXMsCiAgICAgKiBIQUwgd291bGQgYXR0ZW1wdCB0byByZXVzZSB0aGUgQkQgZGVzY3JpcHRvciBpZiB0aGUgQkQgc2lnbmF0dXJlIAogICAgICogbWF0Y2hlcyB0byB0aGUgc2F2ZWQgQkQgZGVzY3JpcHRvci4KICAgICAqLwogICAgIGlmKHBTdGFJbmZvLT53U1RBVHlwZSA9PSBXTEFOX1NUQV9JQlNTKQogICAgICAgIHVjSXNVbmljYXN0ID0gISgoKHRBTklfVTggKilwdlBlZWtEYXRhKVswXSAmIDB4MDEpOwogICAgIGVsc2UKICAgICAgICB1Y0lzVW5pY2FzdCA9IDE7CiAKICAgICAqcHVGYXN0RndkT0sgPSAodl9VMzJfdCkgV0xBTkhBTF9UeEJkRmFzdEZ3ZChwdm9zR0N0eCwgcHZQZWVrRGF0YSwgcE1ldGFJbmZvLT51Y1RJRCwgdWNJc1VuaWNhc3QsIHB2QkRIZWFkZXIsIHVzUGt0TGVuICk7CiAgICAKICAgICAgLyogQ2FuJ3QgYmUgZmFzdCBmb3J3YXJkZWQuIFRyaW0gdGhlIFZPUyBoZWFkIGJhY2sgdG8gb3JpZ2luYWwgbG9jYXRpb24uICovCiAgICAgIGlmKCEgKnB1RmFzdEZ3ZE9LKXsKICAgICAgICAgIHZvc19wa3RfdHJpbV9oZWFkKHZvc0RhdGFCdWZmLCB1Y0R4RUJEV0xBTkhlYWRlckxlbik7CiAgICAgIH1lbHNlewogICAgICAgIC8qIGNvdWxkIGJlIGZhc3QgZm9yd2FyZGVkLiBOb3cgbm90aWZ5IEJBTCBEeEUgaGVhZGVyIGZpbGxpbmcgY291bGQgYmUgY29tcGxldGVseSBza2lwcGVkCiAgICAgICAgICovCiAgICAgICAgdl9VMzJfdCB1UGFja2V0U2l6ZSA9IFdMQU5UTF9CRF9IRUFERVJfTEVOKDApICsgdXNQa3RMZW47CiAgICAgICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX0JBTCwgCiAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCl1UGFja2V0U2l6ZSk7CiAgICAgICAgcER4RUhlYWRlci0+c2l6ZSAgPSBTV0FQX0VORElBTl9VSU5UMzIodVBhY2tldFNpemUpOwogICAgICB9CiAgICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICAgIHJldHVybjsKfQojZW5kaWYgLypXTEFOX1BFUkYqLwojZW5kaWYKCiNpZiAwCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgRlVOQ1RJT04gICAgV0xBTlRMX1ByZXBhcmVCREhlYWRlcgoKICBERVNDUklQVElPTgogICAgSW5saW5lIGZ1bmN0aW9uIGZvciBwcmVwYXJpbmcgQkQgaGVhZGVyIGJlZm9yZSBIQUwgcHJvY2Vzc2luZy4KCiAgREVQRU5ERU5DSUVTCiAgICBKdXN0IG5vdGlmeSBIQUwgdGhhdCBzdXNwZW5kIGluIFRMIGlzIGNvbXBsZXRlLgoKICBQQVJBTUVURVJTCgogICBJTgogICAgdm9zRGF0YUJ1ZmY6ICAgICAgdm9zIGRhdGEgYnVmZmVyCiAgICB1Y0Rpc2FibGVGcm1YdGw6ICBpcyBmcmFtZSB4dGwgZGlzYWJsZWQKCiAgIE9VVAogICAgcHB2QkRIZWFkZXI6ICAgICAgaXQgd2lsbCBjb250YWluIHRoZSBCRCBoZWFkZXIKICAgIHB2RGVzdE1hY0FkZGRyOiAgIGl0IHdpbGwgY29udGFpbiB0aGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKICAgIHB2b3NTdGF0dXM6ICAgICAgIHN0YXR1cyBvZiB0aGUgY29tYmluZWQgcHJvY2Vzc2luZwogICAgcHVzUGt0TGVuOiAgICAgICAgcGFja2V0IGxlbi4KCiAgUkVUVVJOIFZBTFVFCiAgICBObyByZXR1cm4uCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQKV0xBTlRMX1ByZXBhcmVCREhlYWRlcgooCiAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmLAogIHZfUFZPSURfdCogICAgICBwcHZCREhlYWRlciwKICB2X01BQ0FERFJfdCogICAgcHZEZXN0TWFjQWRkZHIsCiAgdl9VOF90ICAgICAgICAgIHVjRGlzYWJsZUZybVh0bCwKICBWT1NfU1RBVFVTKiAgICAgcHZvc1N0YXR1cywKICB2X1UxNl90KiAgICAgICAgcHVzUGt0TGVuLAogIHZfVThfdCAgICAgICAgICB1Y1Fvc0VuYWJsZWQsCiAgdl9VOF90ICAgICAgICAgIHVjV0RTRW5hYmxlZCwKICB2X1U4X3QgICAgICAgICAgZXh0cmFIZWFkU3BhY2UKKQp7CiAgdl9VOF90ICAgICAgdWNIZWFkZXJPZmZzZXQ7CiAgdl9VOF90ICAgICAgdWNIZWFkZXJMZW47CiAgdl9VOF90ICAgICAgdWNCREhlYWRlckxlbiA9IFdMQU5UTF9CRF9IRUFERVJfTEVOKHVjRGlzYWJsZUZybVh0bCk7CgogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgR2V0IGhlYWRlciBwb2ludGVyIGZyb20gVk9TUwogICAgISEhIG1ha2Ugc3VyZSByZXNlcnZlIGhlYWQgemVyb3Mgb3V0IHRoZSBtZW1vcnkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCggdm9zRGF0YUJ1ZmYsIHB1c1BrdExlbik7CgogIGlmICggV0xBTlRMX01BQ19IRUFERVJfTEVOKHVjRGlzYWJsZUZybVh0bCkgPiAqcHVzUGt0TGVuICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBMZW5ndGggb2YgdGhlIHBhY2tldCBzbWFsbGVyIHRoYW4gZXhwZWN0ZWQgbmV0d29yayIKICAgICAgICAgICAgICAgIiBoZWFkZXIgJWQiLCAqcHVzUGt0TGVuICkpOwoKICAgICpwdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgcmV0dXJuOwogIH0KCiAgdm9zX3BrdF9yZXNlcnZlX2hlYWQoIHZvc0RhdGFCdWZmLCBwcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgdWNCREhlYWRlckxlbiApOwogIGlmICggTlVMTCA9PSAqcHB2QkRIZWFkZXIgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOlZPU1MgcGFja2V0IGNvcnJ1cHRlZCBvbiBBdHRhY2ggQkQgaGVhZGVyIikpOwogICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICByZXR1cm47CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IE1BQyBhZGRyZXNzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB7CiAgIHZfU0laRV90IHVzTWFjQWRkclNpemUgPSBWT1NfTUFDX0FERFJfU0laRTsKICAgKnB2b3NTdGF0dXMgPSB2b3NfcGt0X2V4dHJhY3RfZGF0YSggdm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y0JESGVhZGVyTGVuICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9NQUNfQUREUl9BTElHTih1Y0Rpc2FibGVGcm1YdGwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClwdkRlc3RNYWNBZGRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c01hY0FkZHJTaXplICk7CiAgfQogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9ICpwdm9zU3RhdHVzICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZXh0cmFjdCBNQUMgQWRkciAlZCIsCiAgICAgICAgICAgICAgICAqcHZvc1N0YXR1cykpOwogIH0KICBlbHNlCiAgewogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBGaWxsIE1QRFUgaW5mbyBmaWVsZHM6CiAgICAgICAgICAtIE1QRFUgZGF0YSBzdGFydCBvZmZzZXQKICAgICAgICAgIC0gTVBEVSBoZWFkZXIgc3RhcnQgb2Zmc2V0CiAgICAgICAgICAtIE1QRFUgaGVhZGVyIGxlbmd0aAogICAgICAgICAgLSBNUERVIGxlbmd0aCAtIHRoaXMgaXMgYSAxNmIgZmllbGQgLSBuZWVkcyBzd2FwcGluZwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdWNIZWFkZXJPZmZzZXQgPSB1Y0JESGVhZGVyTGVuOwogICAgdWNIZWFkZXJMZW4gICAgPSBXTEFOVExfTUFDX0hFQURFUl9MRU4odWNEaXNhYmxlRnJtWHRsKTsKCiAgICBpZiAoIDAgIT0gdWNEaXNhYmxlRnJtWHRsICkKICAgIHsKICAgICAgaWYgKCAwICE9IHVjUW9zRW5hYmxlZCApCiAgICAgIHsKICAgICAgICB1Y0hlYWRlckxlbiArPSBXTEFOVExfODAyXzExX0hFQURFUl9RT1NfQ1RMOwogICAgICB9CgogICAgICAvLyBTaW1pbGFyIHRvIFFvcyB3ZSBuZWVkIHNvbWV0aGluZyBmb3IgV0RTIGZvcm1hdCAhCiAgICAgIGlmICggdWNXRFNFbmFibGVkICE9IDAgKQogICAgICB7CiAgICAgICAgLy8gSWYgd2UgaGF2ZSBmcmFtZSB0cmFuc2xhdGlvbiBlbmFibGVkCiAgICAgICAgdWNIZWFkZXJMZW4gICAgKz0gV0xBTlRMXzgwMl8xMV9IRUFERVJfQUREUjRfTEVOOwogICAgICB9CiAgICAgIGlmICggZXh0cmFIZWFkU3BhY2UgIT0gMCApCiAgICAgIHsKICAgICAgICAvLyBEZWNyZWFzZSB0aGUgcGFja2V0IGxlbmd0aCB3aXRoIHRoZSBleHRyYSBwYWRkaW5nIGFmdGVyIHRoZSBoZWFkZXIKICAgICAgICAqcHVzUGt0TGVuID0gKnB1c1BrdExlbiAtIGV4dHJhSGVhZFNwYWNlOwogICAgICB9CiAgICB9CgogICAgV0xBTkhBTF9UWF9CRF9TRVRfTVBEVV9IRUFERVJfTEVOKCAqcHB2QkRIZWFkZXIsIHVjSGVhZGVyTGVuKTsKICAgIFdMQU5IQUxfVFhfQkRfU0VUX01QRFVfSEVBREVSX09GRlNFVCggKnBwdkJESGVhZGVyLCB1Y0hlYWRlck9mZnNldCk7CiAgICBXTEFOSEFMX1RYX0JEX1NFVF9NUERVX0RBVEFfT0ZGU0VUKCAqcHB2QkRIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjSGVhZGVyT2Zmc2V0ICsgdWNIZWFkZXJMZW4gKyBleHRyYUhlYWRTcGFjZSk7CiAgICBXTEFOSEFMX1RYX0JEX1NFVF9NUERVX0xFTiggKnBwdkJESGVhZGVyLCAqcHVzUGt0TGVuKTsKCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgIldMQU4gVEw6IFZBTFVFUyBBUkUgSExlbj0leCBIb2ZmPSV4IGRvZmY9JXggbGVuPSV4IGV4PSVkIiwKICAgICAgICAgICAgICAgIHVjSGVhZGVyTGVuLCB1Y0hlYWRlck9mZnNldCwgCiAgICAgICAgICAgICAgICAodWNIZWFkZXJPZmZzZXQgKyB1Y0hlYWRlckxlbiArIGV4dHJhSGVhZFNwYWNlKSwgCiAgICAgICAgICAgICAgICAqcHVzUGt0TGVuLCBleHRyYUhlYWRTcGFjZSkpOwogIH0vKiBpZiBwZWVrIE1BQyBzdWNjZXNzKi8KCn0vKiBXTEFOVExfUHJlcGFyZUJESGVhZGVyICovCiNlbmRpZgoKLy9USElTIElTIEEgSEFDSyBBTkQgTkVFRFMgVE8gQkUgRklYRUQgRk9SIENPTkNVUlJFTkNZCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOX1RMR2V0TmV4dFR4SWRzCgogIERFU0NSSVBUSU9OCiAgICBHZXRzIHRoZSBuZXh0IHN0YXRpb24gYW5kIG5leHQgQUMgaW4gdGhlIGxpc3QgdGhhdCBzaG91bGQgYmUgc2VydmVkIGJ5IHRoZSBUTC4KCiAgICBNdWx0aXBsZSBTdGF0aW9uIFNjaGVkdWxpbmcgYW5kIFRMIHF1ZXVlIG1hbmFnZW1lbnQuIAoKICAgIDQgSEREIEJDL01DIGRhdGEgcGFja2V0IHF1ZXVlIHN0YXR1cyBpcyBzcGVjaWZpZWQgYXMgU3RhdGlvbiAwJ3Mgc3RhdHVzLiBXZWlnaHRzIHVzZWQKICAgIGluIFdGUSBhbGdvcml0aCBhcmUgaW5pdGlhbGl6ZWQgaW4gV0xBTlRMX09QRU4gYW5kIGNvbnRhaW5lZCBpbiB0bENvbmZpZ0luZm8gZmllbGQuCiAgICBFYWNoIHN0YXRpb24gaGFzIGZpZWxkcyBvZiB1Y1BrdFBlbmRpbmcgYW5kIEFDIG1hc2sgdG8gdGVsbCB3aGV0aGVyIGEgQUMgaGFzIHRyYWZmaWMKICAgIG9yIG5vdC4KICAgICAgCiAgICBTdGF0aW9ucyBhcmUgc2VydmVkIGluIGEgcm91bmQtcm9iaW4gZmFzaGlvbiBmcm9tIGhpZ2hlc3QgcHJpb3JpdHkgdG8gbG93ZXN0IHByaW9yaXR5LgogICAgVGhlIG51bWJlciBvZiByb3VuZC1yb2JpbiB0aW1lcyBvZiBlYWNoIHByaW9pcnR5IGVxdWFscyB0byB0aGUgV0ZRIHdlaWdodHMgYW5kIGRpZmZlcmV0aWF0ZXMKICAgIHRoZSB0cmFmZmljIG9mIGRpZmZlcmVudCBwcmlvaXJ0eS4gQXMgc3VjaCwgc3RhdGlvbnMgY2FuIG5vdCBwcm92aWRlIGxvdyBwcmlvcml0eSBwYWNrZXRzIGlmCiAgICBoaWdoIHByaW9yaXR5IHBhY2tldHMgYXJlIGFsbCBzZXJ2ZWQuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogICBPVVQKICAgcHVjU1RBSWQ6ICAgIFN0YXRpb24gSUQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QKCiAgU0lERSBFRkZFQ1RTCiAgIAogICBUTCBjb250ZXh0IGNvbnRhaW5zIGN1cnJlbnRseSBzZXJ2ZWQgc3RhdGlvbiBJRCBpbiB1Y0N1cnJlbnRTVEEgZmllbGQsIGN1cnJlbnRseSBzZXJ2ZWQgQUMKICAgaW4gdUN1clNlcnZlZEFDIGZpZWxkLCBhbmQgdW5zZXJ2ZWQgd2VpZ2h0cyBvZiBjdXJyZW50IEFDIGluIHVDdXJMZWZ0V2VpZ2h0LgogICBXaGVuIGV4aXN0aW5nIGZyb20gdGhlIGZ1bmN0aW9uLCB0aGVzZSB0aHJlZSBmaWVsZHMgYXJlIGNoYW5nZWQgYWNjb3JkaW5nbHkuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOX1RMQVBHZXROZXh0VHhJZHMKKAogIHZfUFZPSURfdCAgICBwdm9zR0N0eCwKICB2X1U4X3QqICAgICAgcHVjU1RBSWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiOwogIHZfVThfdCAgICAgICAgICB1Y0FDRmlsdGVyID0gMTsKICB2X1U4X3QgICAgICAgICAgdWNOZXh0U1RBIDsgCiAgdl9CT09MX3QgICAgICAgIGlzU2VydmVkID0gVFJVRTsgIC8vY3VycmVudCByb3VuZCBoYXMgZmluZCBhIHBhY2tldCBvciBub3QKICB2X1U4X3QgICAgICAgICAgdWNBQ0xvb3BOdW0gPSBXTEFOVExfQUNfVk8gKyAxOyAvL251bWJlciBvZiBsb29wIHRvIGdvCiAgdl9VOF90ICAgICAgICAgIHVGbG93TWFzazsgLy8gVFggRmxvd01hc2sgZnJvbSBXREEKICB1aW50OCAgICAgICAgICAgdWNBQ01hc2s7IAogIHVpbnQ4ICAgICAgICAgICBpID0gMDsgCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgLy9FTlRFUigpOwoKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOX1RMQVBHZXROZXh0VHhJZHMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0RBX0RTX0dldFR4Rmxvd01hc2soIHB2b3NHQ3R4LCAmdUZsb3dNYXNrICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgIldMQU4gVEw6RmFpbGVkIHRvIHJldHJpZXZlIEZsb3cgY29udHJvbCBtYXNrIGZyb20gV0RBIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHVjTmV4dFNUQSA9IHBUTENiLT51Y0N1cnJlbnRTVEE7CgogICsrdWNOZXh0U1RBOwoKICBpZiAoIFdMQU5fTUFYX1NUQV9DT1VOVCA8PSB1Y05leHRTVEEgKQogIHsKICAgIC8vb25lIHJvdW5kIGlzIGRvbmUuCiAgICB1Y05leHRTVEEgPSAwOwogICAgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodC0tOwogICAgaXNTZXJ2ZWQgPSBGQUxTRTsKICAgIGlmICggMCA9PSBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0ICkKICAgIHsKICAgICAgLy9jdXJyZW50IHByaW9pcnR5IGlzIGRvbmUKICAgICAgaWYgKCBXTEFOVExfQUNfQksgPT0gKFdMQU5UTF9BQ0VudW1UeXBlKXBUTENiLT51Q3VyU2VydmVkQUMgKQogICAgICB7CiAgICAgICAgLy9lbmQgb2YgY3VycmVudCBWTywgVkksIEJFLCBCSyBsb29wLiBSZXNldCBwcmlvcml0eS4KICAgICAgICBwVExDYi0+dUN1clNlcnZlZEFDID0gV0xBTlRMX0FDX1ZPOwogICAgICB9CiAgICAgIGVsc2UgCiAgICAgIHsKICAgICAgICBwVExDYi0+dUN1clNlcnZlZEFDIC0tOwogICAgICB9CgogICAgICBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0ID0gIHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbcFRMQ2ItPnVDdXJTZXJ2ZWRBQ107CiAKICAgIH0gLy8gKDAgPT0gcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCkKICB9IC8vKCBXTEFOX01BWF9TVEFfQ09VTlQgPT0gdWNOZXh0U1RBICkKCiAgLy9kZWNpZGUgaG93IG1hbnkgbG9vcHMgdG8gZ28uIGlmIGN1cnJlbnQgbG9vcCBpcyBwYXJ0aWFsLCBkbyBvbmUgZXh0cmEgdG8gbWFrZSBzdXJlCiAgLy93ZSBjb3ZlciBldmVyeSBzdGF0aW9uCiAgaWYgKCgxID09IHBUTENiLT51Y0N1ckxlZnRXZWlnaHQpICYmICh1Y05leHRTVEEgIT0gMCkpCiAgewogICAgdWNBQ0xvb3BOdW0gKys7IC8vIG5vdyBpcyA1IGxvb3BzCiAgfQoKICAvKiBTdGFydCB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkuIHVjTmV4dFNUQSwgcFRMQ2ItPnVDdXJTZXJ2ZWRBQywgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodAogICAgIGFsbCBoYXZlIHByZXZpb3VzIHZhbHVlcy4qLwogIGZvciAoOyB1Y0FDTG9vcE51bSA+IDA7ICB1Y0FDTG9vcE51bS0tKQogIHsKCiAgICB1Y0FDRmlsdGVyID0gMSA8PCBwVExDYi0+dUN1clNlcnZlZEFDOwoKICAgIC8vIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQga2VlcHMgcHJldmlvdXMgcmVzdWx0cy4KICAgIGZvciAoOyAocFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCA+IDApICYmICh1Rmxvd01hc2sgJiB1Y0FDRmlsdGVyKTsgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodC0tICkKICAgIHsKCiAgICAgIGZvciAoIDsgdWNOZXh0U1RBIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyB1Y05leHRTVEEgKysgKQogICAgICB7CiAgICAgICAgaWYoTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdKQogICAgICAgIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLCB1Y0FDTWFzaywgaSk7CgogICAgICAgIGlmICggKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNFeGlzdHMpIHx8CiAgICAgICAgICAgICAoKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNQa3RQZW5kaW5nKSAmJiAhKHVjQUNNYXNrKSkgfHwKICAgICAgICAgICAgICgwID09ICh1Y0FDTWFzayAmIHVjQUNGaWx0ZXIpKSApCgogICAgICAgIHsKICAgICAgICAgIC8vY3VycmVudCBzdGF0aW9uIGRvZXMgbm90IGV4aXN0IG9yIGhhdmUgYW55IHBhY2tldCB0byBzZXJ2ZS4KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT50bFN0YXRlKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIiVzIFN0YSAlZCBub3QgaW4gYXV0aCBzdGF0ZSBzbyBza2lwcGluZyBpdC4iLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCB1Y05leHRTVEEpKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgLy9nbyB0byBuZXh0IHN0YXRpb24gaWYgY3VycmVudCBzdGF0aW9uIGNhbid0IHNlbmQgZHVlIHRvIGZsb3cgY29udHJvbAogICAgICAgIC8vU3RhdGlvbiBpcyBhbGxvd2VkIHRvIHNlbmQgd2hlbiBpdCBpcyBub3QgaW4gTFdNIG1vZGUuIFdoZW4gc3RhdGlvbiBpcyBpbiBMV00gbW9kZSwKICAgICAgICAvL3N0YXRpb24gaXMgYWxsb3dlZCB0byBzZW5kIG9ubHkgYWZ0ZXIgRlcgcmVwb3J0cyBGVyBtZW1vcnkgaXMgYmVsb3cgdGhyZXNob2xkIGFuZCBvbi1mbHkKICAgICAgICAvL3BhY2tldHMgYXJlIGxlc3MgdGhlbiBhbGxvd2VkIHZhbHVlCiAgICAgICAgaWYgKCAoVFJVRSA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT51Y0x3bU1vZGVFbmFibGVkKSAmJgogICAgICAgICAgICAgKChGQUxTRSA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT51Y0x3bUV2ZW50UmVwb3J0ZWQpIHx8CiAgICAgICAgICAgICAgICAgKDAgPCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT51QnVmZlRocmVzaG9sZE1heCkpCiAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCgogICAgICAgIC8vIEZpbmQgYSBzdGF0aW9uLiBXZWlnaHQgaXMgdXBkYXRlZCBhbHJlYWR5LgogICAgICAgICpwdWNTVEFJZCA9IHVjTmV4dFNUQTsKICAgICAgICBwVExDYi0+dWNDdXJyZW50U1RBID0gdWNOZXh0U1RBOwogICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudEFDID0gcFRMQ2ItPnVDdXJTZXJ2ZWRBQzsKICAKICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAiIFRMIHNlcnZlIG9uZSBzdGF0aW9uIEFDOiAlZCAgVzogJWQgU3RhSWQ6ICVkIiwKICAgICAgICAgICAgICAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMsIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQsIHBUTENiLT51Y0N1cnJlbnRTVEEgKSk7CiAgICAgIAogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICAgIH0gLy9TVEEgbG9vcAoKICAgICAgdWNOZXh0U1RBID0gMDsKICAgICAgaWYgKCBGQUxTRSA9PSBpc1NlcnZlZCApCiAgICAgIHsKICAgICAgICAvL2N1cnJlbnQgbG9vcCBmaW5kcyBubyBwYWNrZXQubm8gbmVlZCB0byByZXBlYXQgZm9yIHRoZSBzYW1lIHByaW9yaXR5CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgLy9jdXJyZW50IGxvb3AgaXMgcGFydGlhbCBsb29wLiBnbyBmb3Igb25lIG1vcmUgbG9vcC4KICAgICAgaXNTZXJ2ZWQgPSBGQUxTRTsKCiAgICB9IC8vV2VpZ2h0IGxvb3AKCiAgICBpZiAoV0xBTlRMX0FDX0JLID09IHBUTENiLT51Q3VyU2VydmVkQUMpCiAgICB7CiAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfVk87CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMtLTsKICAgIH0KICAgIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQgPSAgcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1twVExDYi0+dUN1clNlcnZlZEFDXTsKCiAgfS8vIEFDIGxvb3AKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICIgVEwgY2FuJ3QgZmluZCBvbmUgc3RhdGlvbiB0byBzZXJ2ZSIgKSk7CgogIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfQks7CiAgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCA9IDE7CiAgLy9pbnZhbGlkIG51bWJlciB3aWxsIGJlIGNhcHR1cmVkIGJ5IGNhbGxlcgogIHBUTENiLT51Y0N1cnJlbnRTVEEgPSBXTEFOX01BWF9TVEFfQ09VTlQ7IAoKICAqcHVjU1RBSWQgPSBwVExDYi0+dWNDdXJyZW50U1RBOwogIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTl9UTEdldE5leHRUeElkcwoKICBERVNDUklQVElPTgogICAgR2V0cyB0aGUgbmV4dCBzdGF0aW9uIGFuZCBuZXh0IEFDIGluIHRoZSBsaXN0CgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogICBPVVQKICAgcHVjU1RBSWQ6ICAgIFN0YXRpb24gSUQKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTl9UTEdldE5leHRUeElkcwooCiAgdl9QVk9JRF90ICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICBwdWNTVEFJZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2I7CiAgdl9VOF90ICAgICAgICAgIHVjTmV4dEFDOwogIHZfVThfdCAgICAgICAgICB1Y05leHRTVEE7IAogIHZfVThfdCAgICAgICAgICB1Y0NvdW50OyAKICB2X1U4X3QgICAgICAgICAgdUZsb3dNYXNrOyAvLyBUWCBGbG93TWFzayBmcm9tIFdEQQogIHZfVThfdCAgICAgICAgICB1Y0FDTWFzayA9IDA7CiAgdl9VOF90ICAgICAgICAgIGkgPSAwOyAKCiAgdEJzc1N5c3RlbVJvbGUgc3lzdGVtUm9sZTsgLy9SRyBIQUNLIHRvIGJlIHJlbW92ZWQKICB0cEFuaVNpckdsb2JhbCBwTWFjOwoKICBwTWFjID0gdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfUEUsIHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcE1hYyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBNYWMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHN5c3RlbVJvbGUgPSB3ZGFHZXRHbG9iYWxTeXN0ZW1Sb2xlKHBNYWMpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOX1RMR2V0TmV4dFR4SWRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBpZiAoKGVTWVNURU1fQVBfUk9MRSA9PSBzeXN0ZW1Sb2xlKSB8fAogICAgICAodm9zX2NvbmN1cnJlbnRfb3Blbl9zZXNzaW9uc19ydW5uaW5nKCkpIHx8IHBUTENiLT51Y1RkbHNQZWVyQ291bnQpCiNlbHNlCiAgaWYgKChlU1lTVEVNX0FQX1JPTEUgPT0gc3lzdGVtUm9sZSkgfHwKICAgICAgKHZvc19jb25jdXJyZW50X29wZW5fc2Vzc2lvbnNfcnVubmluZygpKSkKI2VuZGlmCiAgewogICAgcmV0dXJuIFdMQU5fVExBUEdldE5leHRUeElkcyhwdm9zR0N0eCxwdWNTVEFJZCk7CiAgfQoKCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0RBX0RTX0dldFR4Rmxvd01hc2soIHB2b3NHQ3R4LCAmdUZsb3dNYXNrICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgIldMQU4gVEw6RmFpbGVkIHRvIHJldHJpZXZlIEZsb3cgY29udHJvbCBtYXNrIGZyb20gV0RBIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qU1RBIGlkIC0gbm8gcHJpb3JpdHkgeWV0IGltcGxlbWVudGVkICovCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hvb3NlIHRoZSBuZXh0IFNUQSBmb3IgdHggLSBmb3Igbm93IGdvIGluIGEgcm91bmQgcm9iaW4gZmFzaGlvbgogICAgdGhyb3VnaCBhbGwgdGhlIHN0YXRpb25zIHRoYXQgaGF2ZSBwZW5kaW5nIHBhY2tldHMgICAgIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHVjTmV4dFNUQSA9IHBUTENiLT51Y0N1cnJlbnRTVEE7CiAgCiAgcFRMQ2ItPnVjQ3VycmVudFNUQSA9IFdMQU5fTUFYX1NUQV9DT1VOVDsgCiAgZm9yICggdWNDb3VudCA9IDA7IAogICAgICAgIHVjQ291bnQgPCBXTEFOX01BWF9TVEFfQ09VTlQ7CiAgICAgICAgdWNDb3VudCsrICkKICB7CiAgICB1Y05leHRTVEEgPSAoICh1Y05leHRTVEErMSkgPj0gV0xBTl9NQVhfU1RBX0NPVU5UICk/MDoodWNOZXh0U1RBKzEpOwogICAgaWYoTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdKQogICAgewogICAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKCggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNFeGlzdHMgKSAmJgogICAgICAgICggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNQa3RQZW5kaW5nICkpCiAgICB7CiAgICAgIGlmIChXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dGxTdGF0ZSkKICAgICAgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJTVEEgSUQ6ICVkIG9uIFdMQU5fVExHZXROZXh0VHhJZHMiLCAqcHVjU1RBSWQpKTsKICAgICAgICBwVExDYi0+dWNDdXJyZW50U1RBID0gdWNOZXh0U1RBOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICIlcyBTdGEgJWQgaXMgbm90IGluIGF1dGggc3RhdGUsIHNraXBwaW5nIHRoaXMgc3RhLiIsCiAgICAgICAgICAgICAgIF9fZnVuY19fLCB1Y05leHRTVEEpKTsKICAgICAgfQogICAgfQogIH0KCiAgKnB1Y1NUQUlkID0gcFRMQ2ItPnVjQ3VycmVudFNUQTsKCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoICpwdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAiV0xBTiBUTDpObyBzdGF0aW9uIHJlZ2lzdGVyZWQgd2l0aCBUTCBhdCB0aGlzIHBvaW50IikpOwoKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CgogIH0KCiAgLypDb252ZXJ0IHRoZSBhcnJheSB0byBhIG1hc2sgZm9yIGVhc2llciBvcGVyYXRpb24qLwogIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLKCBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLCB1Y0FDTWFzaywgaSk7CiAgCiAgaWYgKCAwID09IHVjQUNNYXNrICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOiBNYXNrIDAgIgogICAgICAiU1RBIElEOiAlZCBvbiBXTEFOX1RMR2V0TmV4dFR4SWRzIiwgKnB1Y1NUQUlkKSk7CgogICAgIC8qc2V0dGluZyBTVEEgaWQgdG8gaW52YWxpZCBpZiBtYXNrIGlzIDAqLwogICAgICpwdWNTVEFJZCA9IFdMQU5fTUFYX1NUQV9DT1VOVDsKCiAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFDIGlzIHVwZGF0ZWQgd2hlbmV2ZXIgYSBwYWNrZXQgaXMgZmV0Y2hlZCBmcm9tIEhERCAtPiB0aGUgY3VycmVudAogICAgd2VpZ2h0IG9mIHN1Y2ggYW4gQUMgY2Fubm90IGJlIDAgLT4gaW4gdGhpcyBjYXNlIFRMIGlzIGV4cGVjdGVkIHRvCiAgICBleGl0IHRoaXMgZnVuY3Rpb24gYXQgdGhpcyBwb2ludCBkdXJpbmcgdGhlIG1haW4gVHggbG9vcAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIDAgPCBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRXZWlnaHQgICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogTWFpbnRhaW5pbmcgc2VydmljZWQgQUMgdG86ICVkIGZvciBXZWlnaHQ6ICVkIiwKICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50QUMgLAogICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRXZWlnaHQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgQ2hvb3NlIGhpZ2hlc3QgcHJpb3JpdHkgQUMgLSAhISEgb3B0aW1pemUgbWUKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdWNOZXh0QUMgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRBQzsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiTmV4dCBBQzogJWQiLCB1Y05leHRBQykpOwoKICB3aGlsZSAoIDAgIT0gdWNBQ01hc2sgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiIEFDIE1hc2s6ICVkIE5leHQ6ICVkIFJlcyA6ICVkIiwKICAgICAgICAgICAgICAgdWNBQ01hc2ssICggMSA8PCB1Y05leHRBQyApLCAoIHVjQUNNYXNrICYgKCAxIDw8IHVjTmV4dEFDICkpKSk7CgogICAgaWYgKCAwICE9ICggdWNBQ01hc2sgJiAoIDEgPDwgdWNOZXh0QUMgKSAmIHVGbG93TWFzayApKQogICAgewogICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50QUMgICAgID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0xBTlRMX0FDRW51bVR5cGUpdWNOZXh0QUM7CiAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRXZWlnaHQgPQogICAgICAgICAgICAgICAgICAgICAgIHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNOZXh0QUNdOwoKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogU3dpdGNoaW5nIHNlcnZpY2VkIEFDIHRvOiAlZCB3aXRoIFdlaWdodDogJWQiLAogICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRBQyAsCiAgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudFdlaWdodCkpOwogICAgICAgYnJlYWs7CiAgICB9CgogICAgdWNOZXh0QUMgPSAoIHVjTmV4dEFDIC0gMSApICYgV0xBTlRMX01BU0tfQUM7CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIk5leHQgQUMgJWQiLCB1Y05leHRBQykpOwoKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiIEMgQUM6ICVkIEMgVzogJWQiLAogICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50QUMsCiAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRXZWlnaHQpKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5fVExHZXROZXh0VHhJZHMgKi8KCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBERUZBVUxUIEhBTkRMRVJTOiBSZWdpc3RlcmVkIGF0IGluaXRpYWxpemF0aW9uIHdpdGggVEwKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2IKCiAgREVTQ1JJUFRJT04KICAgIERlZmF1bHQgTWdtdCBGcm0gcnggY2FsbGJhY2s6IGFzc2VydHMgYWxsIHRoZSB0aW1lLiBJZiB0aGlzIGZ1bmN0aW9uIGdldHMKICAgIGNhbGxlZCAgaXQgbWVhbnMgdGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCByeCBjYiBwb2ludGVyIGZvciBNZ210IEZybS4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKICAgIE5vdCB1c2VkLgoKICBSRVRVUk4gVkFMVUUKCiAgIFZPU19TVEFUVVNfRV9GQUlMVVJFOiBBbHdheXMgRkFJTFVSRS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2IKKAogIHZfUFZPSURfdCAgcHZvc0dDdHgsCiAgdl9QVk9JRF90ICB2b3NCdWZmCikKewogIGlmICggTlVMTCAhPSB2b3NCdWZmICkKICB7CiAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAiV0xBTiBUTDpGYXRhbCBmYWlsdXJlOiBObyByZWdpc3RlcmVkIE1nbXQgRnJtIGNsaWVudCBvbiBwa3QgUlgiKSk7CiAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCh2b3NfcGt0X3QgKil2b3NCdWZmKTsKICB9CgogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJXTEFOIFRMOiBObyByZWdpc3RlcmVkIE1nbXQgRnJtIGNsaWVudCBvbiBwa3QgUlguIExvYWQvVW5sb2FkIGluIHByb2dyZXNzLCBJZ25vcmUiKSk7CgogIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKfS8qV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYiovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgV0xBTlRMX0JBUFJ4RGVmYXVsdENiCgogIERFU0NSSVBUSU9OCiAgICBEZWZhdWx0IEJBUCByeCBjYWxsYmFjazogYXNzZXJ0cyBhbGwgdGhlIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gZ2V0cwogICAgY2FsbGVkICBpdCBtZWFucyB0aGVyZSBpcyBubyByZWdpc3RlcmVkIHJ4IGNiIHBvaW50ZXIgZm9yIEJBUC4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKICAgIE5vdCB1c2VkLgoKICBSRVRVUk4gVkFMVUUKCiAgIFZPU19TVEFUVVNfRV9GQUlMVVJFOiBBbHdheXMgRkFJTFVSRS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9CQVBSeERlZmF1bHRDYgooCiAgdl9QVk9JRF90ICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICAgIHZvc0RhdGFCdWZmLAogIFdMQU5UTF9CQVBGcmFtZUVudW1UeXBlIGZyYW1lVHlwZQopCnsKICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAiV0xBTiBUTDpGYXRhbCBmYWlsdXJlOiBObyByZWdpc3RlcmVkIEJBUCBjbGllbnQgb24gQkFQIHBrdCBSWCIpKTsKI2lmbmRlZiBCVEFNUF9URVNUCiAgVk9TX0FTU0VSVCgwKTsKI2VuZGlmCiAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwp9LypXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVJ4RGVmYXVsdENiCgogIERFU0NSSVBUSU9OCiAgICBEZWZhdWx0IFNUQSByeCBjYWxsYmFjazogYXNzZXJ0cyBhbGwgdGhlIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gZ2V0cwogICAgY2FsbGVkICBpdCBtZWFucyB0aGVyZSBpcyBubyByZWdpc3RlcmVkIHJ4IGNiIHBvaW50ZXIgZm9yIHN0YXRpb24uCiAgICAoTWVtIGNvcnJ1cHRpb24gbW9zdCBsaWtlbHksIGl0IHNob3VsZCBuZXZlciBoYXBwZW4pCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCiAgICBOb3QgdXNlZC4KCiAgUkVUVVJOIFZBTFVFCgogICAgVk9TX1NUQVRVU19FX0ZBSUxVUkU6IEFsd2F5cyBGQUlMVVJFLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVJ4RGVmYXVsdENiCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICAgICAgICAgICB2b3NEYXRhQnVmZiwKICB2X1U4X3QgICAgICAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSogIHBSeE1ldGFJbmZvCikKewogIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICJXTEFOIFRMOiBObyByZWdpc3RlcmVkIFNUQSBjbGllbnQgcnggY2IgZm9yIFNUQUlEOiAlZCBkcm9wcGluZyBwa3QiLAogICAgICAgICAgICAgICB1Y1NUQUlkKSk7CiAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LypXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFGZXRjaFBrdERlZmF1bHRDYgoKICBERVNDUklQVElPTgogICAgRGVmYXVsdCBmZXRjaCBjYWxsYmFjazogYXNzZXJ0cyBhbGwgdGhlIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gZ2V0cwogICAgY2FsbGVkICBpdCBtZWFucyB0aGVyZSBpcyBubyByZWdpc3RlcmVkIGZldGNoIGNiIHBvaW50ZXIgZm9yIHN0YXRpb24uCiAgICAoTWVtIGNvcnJ1cHRpb24gbW9zdCBsaWtlbHksIGl0IHNob3VsZCBuZXZlciBoYXBwZW4pCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCiAgICBOb3QgdXNlZC4KCiAgUkVUVVJOIFZBTFVFCgogICAgVk9TX1NUQVRVU19FX0ZBSUxVUkU6IEFsd2F5cyBGQUlMVVJFLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQUZldGNoUGt0RGVmYXVsdENiCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICAgICAgICAgICAgcHVjU1RBSWQsCiAgV0xBTlRMX0FDRW51bVR5cGUgICAgICB1Y0FDLAogIHZvc19wa3RfdCoqICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsCiAgV0xBTlRMX01ldGFJbmZvVHlwZSogICB0bE1ldGFJbmZvCikKewogIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICJXTEFOIFRMOkZhdGFsIGZhaWx1cmU6IE5vIHJlZ2lzdGVyZWQgU1RBIGNsaWVudCBvbiBkYXRhIHBrdCBSWCIpKTsKICBWT1NfQVNTRVJUKDApOwogIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKfS8qV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYiovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9UeENvbXBEZWZhdWx0Q2IKCiAgREVTQ1JJUFRJT04KICAgIERlZmF1bHQgdHggY29tcGxldGUgaGFuZGxlci4gSXQgd2lsbCByZWxlYXNlIHRoZSBjb21wbGV0ZWQgcGt0IHRvCiAgICBwcmV2ZW50IG1lbW9yeSBsZWFrcy4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0bwogICAgICAgICAgICAgICAgICAgIFRML0hBTC9QRS9CQVAvSEREIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tCiAgICAgICAgICAgICAgICAgICAgaXRzIGNvbnRleHQKICAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIFZPU1MgZGF0YSBidWZmZXIgdGhhdCB3YXMgdHJhbnNtaXR0ZWQKICAgIHdUeFNUQXR1czogICAgICBzdGF0dXMgb2YgdGhlIHRyYW5zbWlzc2lvbgoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbjsgcGxlYXNlCiAgICBjaGVjayB2b3NfcGt0X3JldHVybl9wYWNrZXQgZm9yIHBvc3NpYmxlIGVycm9yIGNvZGVzLgoKICAgIFBsZWFzZSBjaGVjayAgdm9zX3BrdF9yZXR1cm5fcGFja2V0IEFQSSBmb3IgcG9zc2libGUgcmV0dXJuIHZhbHVlcy4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeENvbXBEZWZhdWx0Q2IKKAogdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCiB2b3NfcGt0X3QqICAgICB2b3NEYXRhQnVmZiwKIFZPU19TVEFUVVMgICAgIHdUeFNUQXR1cwopCnsKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAiV0xBTiBUTDpUWENvbXAgbm90IHJlZ2lzdGVyZWQsIHJlbGVhc2luZyBwa3QgdG8gcHJldmVudCBtZW0gbGVhayIpKTsKICByZXR1cm4gdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKfS8qV0xBTlRMX1R4Q29tcERlZmF1bHRDYiovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBDbGVhbnVwIGZ1bmN0aW9ucwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0NsZWFuQ0IKCiAgREVTQ1JJUFRJT04KICAgIENsZWFucyBUTCBjb250cm9sIGJsb2NrCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHBUTENiOiAgICAgICBwb2ludGVyIHRvIFRMJ3MgY29udHJvbCBibG9jawogICAgdWNFbXB0eTogICAgIHNldCBpZiBUTCBoYXMgdG8gY2xlYW4gdXAgdGhlIHF1ZXVlcyBhbmQgcmVsZWFzZSBwZWRuaW5nIHBrdHMKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9DbGVhbkNCCigKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IsCiAgdl9VOF90ICAgICAgdWNFbXB0eQopCnsKICB2X1U4X3QgdWNJbmRleDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0NsZWFuQ0IiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyogbnVtYmVyIG9mIHBhY2tldHMgc2VudCB0byBCQUwgd2FpdGluZyBmb3IgdHggY29tcGxldGUgY29uZmlybWF0aW9uICovCiAgcFRMQ2ItPnVzUGVuZGluZ1R4Q29tcGxldGVDb3VudCA9IDA7CgogIC8qIGdsb2JhbCBzdXNwZW5kIGZsYWcgKi8KICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+dWNUeFN1c3BlbmRlZCwgMSk7CgogIC8qIHJlc291cmNlIGZsYWcgKi8KICBwVExDYi0+dVJlc0NvdW50ID0gMDsKCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2xpZW50IHN0YXRpb25zCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTl9NQVhfU1RBX0NPVU5UIDsgdWNJbmRleCsrKQogIHsKICAgIGlmKE5VTEwgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0pCiAgICB7CiAgICAgICAgV0xBTlRMX0NsZWFuU1RBKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XSwgdWNFbXB0eSk7CiAgICB9CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIE1hbmFnZW1lbnQgRnJhbWUgY2xpZW50CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMgPSAwOwoKICBpZiAoICggMCAhPSB1Y0VtcHR5KSAmJgogICAgICAgKCBOVUxMICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkpCiAgewogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmKTsKICB9CgogIHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICA9IE5VTEw7CgogIC8qIHNldCB0byBhIGRlZmF1bHQgY2IgaW4gb3JkZXIgdG8gcHJldmVudCBjb25zdGFudCBjaGVja2luZyBmb3IgTlVMTCAqLwogIHBUTENiLT50bE1nbXRGcm1DbGllbnQucGZuVGxNZ210RnJtUnggPSBXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEJUIEFNUCBjbGllbnQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2ItPnRsQkFQQ2xpZW50LnVjRXhpc3RzID0gMDsKCiAgaWYgKCggMCAhPSB1Y0VtcHR5KSAmJgogICAgICAoIE5VTEwgIT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApKQogIHsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmKTsKICB9CiAgCiAgaWYgKCggMCAhPSB1Y0VtcHR5KSAmJgogICAgICAoIE5VTEwgIT0gcFRMQ2ItPnZvc0R1bW15QnVmICkpCiAgewogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT52b3NEdW1teUJ1Zik7CiAgfQoKICBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICA9IE5VTEw7CgogIHBUTENiLT52b3NEdW1teUJ1ZiA9IE5VTEw7CiAgcFRMQ2ItPnZvc1RlbXBCdWYgID0gTlVMTDsKICBwVExDYi0+dWNDYWNoZWRTVEFJZCA9IFdMQU5fTUFYX1NUQV9DT1VOVDsKCiAgLyogc2V0IHRvIGEgZGVmYXVsdCBjYiBpbiBvcmRlciB0byBwcmV2ZW50IGNvbnN0YW50IGNoZWNraW5nIGZvciBOVUxMICovCiAgcFRMQ2ItPnRsQkFQQ2xpZW50LnBmblRsQkFQUnggPSBXTEFOVExfQkFQUnhEZWZhdWx0Q2I7CgogIHBUTENiLT51Y1JlZ2lzdGVyZWRTdGFJZCA9IFdMQU5fTUFYX1NUQV9DT1VOVDsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKCn0vKiBXTEFOVExfQ2xlYW5DQiovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9DbGVhblNUQQoKICBERVNDUklQVElPTgogICAgQ2xlYW5zIGEgc3RhdGlvbiBjb250cm9sIGJsb2NrLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjRW1wdHk6ICAgICAgICBpZiBzZXQgdGhlIHF1ZXVlcyBhbmQgcGVuZGluZyBwa3RzIHdpbGwgYmUgZW1wdHllZAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9DbGVhblNUQQooCiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICBwdGxTVEFDbGllbnQsCiAgdl9VOF90ICAgICAgICAgICAgIHVjRW1wdHkKKQp7CiAgdl9VOF90ICB1Y0luZGV4OwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHRsU1RBQ2xpZW50ICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0NsZWFuU1RBIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDbGVhciBzdGF0aW9uIGZyb20gVEwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6IENsZWFyaW5nIFNUQSBDbGllbnQgSUQ6ICVkLCBFbXB0eSBmbGFnOiAlZCIsCiAgICAgICAgICAgICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjU1RBSWQsIHVjRW1wdHkgKSk7CgogIHB0bFNUQUNsaWVudC0+cGZuU1RBUnggICAgICAgICAgPSBXTEFOVExfU1RBUnhEZWZhdWx0Q2I7CiAgcHRsU1RBQ2xpZW50LT5wZm5TVEFUeENvbXAgICAgICA9IFdMQU5UTF9UeENvbXBEZWZhdWx0Q2I7CiAgcHRsU1RBQ2xpZW50LT5wZm5TVEFGZXRjaFBrdCAgICA9IFdMQU5UTF9TVEFGZXRjaFBrdERlZmF1bHRDYjsKCiAgcHRsU1RBQ2xpZW50LT50bFN0YXRlICAgICAgICAgICA9IFdMQU5UTF9TVEFfSU5JVDsKICBwdGxTVEFDbGllbnQtPnRsUHJpICAgICAgICAgICAgID0gV0xBTlRMX1NUQV9QUklfTk9STUFMOwoKICB2b3NfemVyb19tYWNhZGRyKCAmcHRsU1RBQ2xpZW50LT53U1RBRGVzYy52U1RBTUFDQWRkcmVzcyApOwogIHZvc196ZXJvX21hY2FkZHIoICZwdGxTVEFDbGllbnQtPndTVEFEZXNjLnZCU1NJRGZvcklCU1MgKTsKICB2b3NfemVyb19tYWNhZGRyKCAmcHRsU1RBQ2xpZW50LT53U1RBRGVzYy52U2VsZk1BQ0FkZHJlc3MgKTsKCiAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1NUQUlkICA9IDA7CiAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy53U1RBVHlwZSA9IFdMQU5fU1RBX01BWDsKCiAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQgICAgID0gMDsKICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjQWRkUm12TExDICAgICAgPSAwOwogIHB0bFNUQUNsaWVudC0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uID0gMDsKICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjU3dGcmFtZVJYWGxhdGlvbiA9IDA7CiAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1Byb3RlY3RlZEZyYW1lID0gMDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBBTVNEVSBpbmZvcm1hdGlvbiBmb3IgdGhlIFNUQQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoICggMCAhPSB1Y0VtcHR5ICkgJiYKICAgICAgICggTlVMTCAhPSBwdGxTVEFDbGllbnQtPnZvc0FNU0RVQ2hhaW5Sb290ICkpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgICAiV0xBTiBUTDpOb24gTlVMTCB2b3NBTVNEVUNoYWluUm9vdCBvbiBXTEFOVExfQ2xlYW5TVEEsICIKICAgICAgICAgICAgICAgInN1c3BlY3RpbmcgYSBtZW1vcnkgY29ycnVwdGlvbiIpKTsKCiAgfQoKICBwdGxTVEFDbGllbnQtPnZvc0FNU0RVQ2hhaW4gICAgID0gTlVMTDsKICBwdGxTVEFDbGllbnQtPnZvc0FNU0RVQ2hhaW5Sb290ID0gTlVMTDsKCiAgdm9zX21lbV96ZXJvKCAodl9QVk9JRF90KXB0bFNUQUNsaWVudC0+YXVjTVBEVUhlYWRlciwKICAgICAgICAgICAgICAgICBXTEFOVExfTVBEVV9IRUFERVJfTEVOKTsKICBwdGxTVEFDbGllbnQtPnVjTVBEVUhlYWRlckxlbiAgICA9IDA7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVvcmRlcmluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIFNUQQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5fTUFYX1RJRCA7IHVjSW5kZXgrKykKICB7CiAgICBpZigwID09IHB0bFNUQUNsaWVudC0+YXRsQkFSZW9yZGVySW5mb1t1Y0luZGV4XS51Y0V4aXN0cykKICAgIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZihOVUxMICE9IHB0bFNUQUNsaWVudC0+YXRsQkFSZW9yZGVySW5mb1t1Y0luZGV4XS5yZW9yZGVyQnVmZmVyKQogICAgewogICAgICBwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0ucmVvcmRlckJ1ZmZlci0+aXNBdmFpbGFibGUgPSBWT1NfVFJVRTsKICAgICAgbWVtc2V0KCZwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0ucmVvcmRlckJ1ZmZlci0+YXJyYXlCdWZmZXJbMF0sIDAsIFdMQU5UTF9NQVhfV0lOU0laRSAqIHNpemVvZih2X1BWT0lEX3QpKTsKICAgIH0KICAgIHZvc190aW1lcl9kZXN0cm95KCZwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0uYWdpbmdUaW1lcik7CiAgICBtZW1zZXQoJnB0bFNUQUNsaWVudC0+YXRsQkFSZW9yZGVySW5mb1t1Y0luZGV4XSwgMCwgc2l6ZW9mKFdMQU5UTF9CQVJlb3JkZXJUeXBlKSk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBRT1MgaW5mb3JtYXRpb24gZm9yIHRoZSBTVEEKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICBwdGxTVEFDbGllbnQtPnVjQ3VycmVudEFDICAgICA9IFdMQU5UTF9BQ19WTzsKICAgcHRsU1RBQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQgPSAwOwogICBwdGxTVEFDbGllbnQtPnVjU2VydmljZWRBQyAgICA9IFdMQU5UTF9BQ19CSzsKCiAgIHZvc19tZW1femVybyggcHRsU1RBQ2xpZW50LT5hdWNBQ01hc2ssIHNpemVvZihwdGxTVEFDbGllbnQtPmF1Y0FDTWFzaykpOwogICB2b3NfbWVtX3plcm8oICZwdGxTVEFDbGllbnQtPndVQVBTREluZm8sIHNpemVvZihwdGxTVEFDbGllbnQtPndVQVBTREluZm8pKTsKCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFN0YXRzIGluZm8KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgdm9zX21lbV96ZXJvKCBwdGxTVEFDbGllbnQtPmF1UnhDb3VudCwKICAgICAgICAgICAgICAgICBzaXplb2YocHRsU1RBQ2xpZW50LT5hdVJ4Q291bnRbMF0pKiBXTEFOX01BWF9USUQpOwogICB2b3NfbWVtX3plcm8oIHB0bFNUQUNsaWVudC0+YXVUeENvdW50LAogICAgICAgICAgICAgICAgIHNpemVvZihwdGxTVEFDbGllbnQtPmF1VHhDb3VudFswXSkqIFdMQU5fTUFYX1RJRCk7CiAgIHB0bFNUQUNsaWVudC0+cnNzaUF2ZyA9IDA7CgogICAvKlR4IG5vdCBzdXNwZW5kZWQgYW5kIHN0YXRpb24gZnVsbHkgcmVnaXN0ZXJlZCovCiAgIHZvc19hdG9taWNfc2V0X1U4KCAmcHRsU1RBQ2xpZW50LT51Y1R4U3VzcGVuZGVkLCAwKTsKICAgdm9zX2F0b21pY19zZXRfVTgoICZwdGxTVEFDbGllbnQtPnVjTm9Nb3JlRGF0YSwgMSk7CgogIGlmICggMCA9PSB1Y0VtcHR5ICkKICB7CiAgICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjVWNhc3RTaWcgICAgICAgPSBXTEFOX1RMX0lOVkFMSURfVV9TSUc7CiAgICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjQmNhc3RTaWcgICAgICAgPSBXTEFOX1RMX0lOVkFMSURfQl9TSUc7CiAgfQoKICBwdGxTVEFDbGllbnQtPnVjRXhpc3RzICAgICAgID0gMDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU3RhdGlzdGljcyBpbmZvIAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIG1lbXNldCgmcHRsU1RBQ2xpZW50LT50cmFmZmljU3RhdGlzdGljcywKICAgICAgICAgMCwKICAgICAgICAgc2l6ZW9mKFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSkpOwoKICAvKmZpeCBtZSEhOiBhZGQgbmV3IHZhbHVlcyBmcm9tIHRoZSBUTCBDYiBmb3IgY2xlYW51cCAqLwogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfQ2xlYW5TVEEgKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX0VuYWJsZVVBUFNERm9yQUMKCiAgREVTQ1JJUFRJT04KICAgQ2FsbGVkIGJ5IEhERCB0byBlbmFibGUgVUFQU0QuIFRMIGluIHR1cm4gY2FsbHMgV0RBIEFQSSB0byBlbmFibGUgdGhlCiAgIGxvZ2ljIGluIEZXL1NMTSB0byBzdGFydCBzZW5kaW5nIHRyaWdnZXIgZnJhbWVzLiBQcmV2aW91c2x5IFRMIGhhZCB0aGUKICAgdHJpZ2dlciBmcmFtZSBsb2dpYyB3aGljaCBsYXRlciBtb3ZlZCBkb3duIHRvIEZXLiBIZW5jZQogICBIREQgLT4gVEwgLT4gV0RBIC0+IEZXIGNhbGwgZmxvdy4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gSWQKICAgIHVjQUM6ICAgICAgICAgICBBQyBmb3Igd2hpY2ggVS1BUFNEIGlzIGJlaW5nIGVuYWJsZWQKICAgIHVjVGlkOiAgICAgICAgICBUSUQgZm9yIHdoaWNoIFUtQVBTRCBpcyBzZXR1cAogICAgdWNVUDogICAgICAgICAgIHVzZWQgdG8gcGxhY2UgaW4gdGhlIHRyaWdnZXIgZnJhbWUgZ2VuZXJhdGlvbgogICAgdWNTZXJ2aWNlSW50OiAgIHNlcnZpY2UgaW50ZXJ2YWwgdXNlZCBieSBUTCB0byBzZW5kIHRyaWdnZXIgZnJhbWVzCiAgICB1Y1N1c3BlbmRJbnQ6ICAgc3VzcGVuZCBpbnRlcnZhbCB1c2VkIGJ5IFRMIHRvIGRldGVybWluZSB0aGF0IGFuCiAgICAgICAgICAgICAgICAgICAgYXBwIGlzIGlkbGUgYW5kIHNob3VsZCBzdGFydCBzZW5kaW5nIHRyaWdnIGZybXMgbGVzcyBvZnRlbgogICAgd1RTRGlyOiAgICAgICAgIGRpcmVjdGlvbiBvZiBUU3BlYwoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9FbmFibGVVQVBTREZvckFDCigKICB2X1BWT0lEX3QgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgIHVjU1RBSWQsCiAgV0xBTlRMX0FDRW51bVR5cGUgIHVjQUMsCiAgdl9VOF90ICAgICAgICAgICAgIHVjVGlkLAogIHZfVThfdCAgICAgICAgICAgICB1Y1VQLAogIHZfVTMyX3QgICAgICAgICAgICB1U2VydmljZUludCwKICB2X1UzMl90ICAgICAgICAgICAgdVN1c3BlbmRJbnQsCiAgV0xBTlRMX1RTRGlyVHlwZSAgIHdUU0RpcgopCnsKCiAgV0xBTlRMX0NiVHlwZSogICAgICBwVExDYiAgICAgID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1cyAgID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIHRVYXBzZEluZm8gICAgICAgICAgaGFsVUFQU0RJbmZvOyAKIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICgoIE5VTEwgPT0gcFRMQ2IgKSB8fCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKQogICAgICB8fCAgIFdMQU5UTF9BQ19JTlZBTElEKHVjQUMpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBpbnB1dCBwYXJhbXMgb24gV0xBTlRMX0VuYWJsZVVBUFNERm9yQUMiCiAgICAgICAgICAgICAgICIgVEw6ICVwICBTVEE6ICVkICBBQzogJWQiLAogICAgICAgICAgICAgICBwVExDYiwgdWNTVEFJZCwgdWNBQykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgLypTZXQgdGhpcyBmbGFnIGluIG9yZGVyIHRvIHJlbWVtYmVyIHRoYXQgdGhpcyBpcyBhIHRyaWdnZXIgZW5hYmxlZCBBQyovCiAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndVQVBTREluZm9bdWNBQ10udWNTZXQgPSAxOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgaWYocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndTVEFEZXNjLndTVEFUeXBlICE9IFdMQU5fU1RBX1RETFMpCiNlbmRpZgogIHsKICAgIGlmKCAwID09IHVTZXJ2aWNlSW50ICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnB1dCBwYXJhbXMgb24gV0xBTlRMX0VuYWJsZVVBUFNERm9yQUMiCiAgICAgICAgICAgICAgICIgU0k6ICVkIiwgdVNlcnZpY2VJbnQgKSk7CiAgICB9CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6RW5hYmxpbmcgVS1BUFNEIGluIEZXIGZvciBTVEE6ICVkIEFDOiAlZCBTSTogJWQgU1BJOiAlZCAiCiAgICAgICAgICAgICAgICJESTogJWQiLAogICAgICAgICAgICAgICB1Y1NUQUlkLCB1Y0FDLCB1U2VydmljZUludCwgdVN1c3BlbmRJbnQsCiAgICAgICAgICAgICAgIHBUTENiLT50bENvbmZpZ0luZm8udURlbGF5ZWRUcmlnZ2VyRnJtSW50KSk7CgogICAgLypTYXZlIGFsbCBpbmZvIGZvciBIQUwqLwogICAgaGFsVUFQU0RJbmZvLnN0YWlkeCAgICAgICAgID0gdWNTVEFJZDsKICAgIGhhbFVBUFNESW5mby5hYyAgICAgICAgICAgICA9IHVjQUM7CiAgICBoYWxVQVBTREluZm8udXAgICAgICAgICAgICAgPSB1Y1VQOwogICAgaGFsVUFQU0RJbmZvLnNydkludGVydmFsICAgID0gdVNlcnZpY2VJbnQ7CiAgICBoYWxVQVBTREluZm8uc3VzSW50ZXJ2YWwgICAgPSB1U3VzcGVuZEludDsKICAgIGhhbFVBUFNESW5mby5kZWxheUludGVydmFsICA9IHBUTENiLT50bENvbmZpZ0luZm8udURlbGF5ZWRUcmlnZ2VyRnJtSW50OwoKICAgIC8qTm90aWZ5IEhBTCovCiAgICB2b3NTdGF0dXMgPSBXREFfRW5hYmxlVWFwc2RBY1BhcmFtcyhwdm9zR0N0eCwgdWNTVEFJZCwgJmhhbFVBUFNESW5mbyk7CiAgfQogIHJldHVybiB2b3NTdGF0dXM7Cgp9LypXTEFOVExfRW5hYmxlVUFQU0RGb3JBQyovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9EaXNhYmxlVUFQU0RGb3JBQwoKICBERVNDUklQVElPTgogICBDYWxsZWQgYnkgSEREIHRvIGRpc2FibGUgVUFQU0QuIFRMIGluIHR1cm4gY2FsbHMgV0RBIEFQSSB0byBkaXNhYmxlIHRoZQogICBsb2dpYyBpbiBGVy9TTE0gdG8gc3RvcCBzZW5kaW5nIHRyaWdnZXIgZnJhbWVzLiBQcmV2aW91c2x5IFRMIGhhZCB0aGUKICAgdHJpZ2dlciBmcmFtZSBsb2dpYyB3aGljaCBsYXRlciBtb3ZlZCBkb3duIHRvIEZXLiBIZW5jZQogICBIREQgLT4gVEwgLT4gV0RBIC0+IEZXIGNhbGwgZmxvdy4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gSWQKICAgIHVjQUM6ICAgICAgICAgQUMgZm9yIHdoaWNoIFUtQVBTRCBpcyBiZWluZyBlbmFibGVkCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9EaXNhYmxlVUFQU0RGb3JBQwooCiAgdl9QVk9JRF90ICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9BQ0VudW1UeXBlICB1Y0FDCikKewogIFdMQU5UTF9DYlR5cGUqIHBUTENiOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICgoIE5VTEwgPT0gcFRMQ2IgKSB8fCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKQogICAgICB8fCAgIFdMQU5UTF9BQ19JTlZBTElEKHVjQUMpICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgaW5wdXQgcGFyYW1zIG9uIFdMQU5UTF9EaXNhYmxlVUFQU0RGb3JBQyIKICAgICAgICAgICAgICAgIiBUTDogJXAgIFNUQTogJWQgIEFDOiAlZCIsIHBUTENiLCB1Y1NUQUlkLCB1Y0FDICkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgLypSZXNldCB0aGlzIGZsYWcgYXMgdGhpcyBpcyBubyBsb25nZXIgYSB0cmlnZ2VyIGVuYWJsZWQgQUMqLwogIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT53VUFQU0RJbmZvW3VjQUNdLnVjU2V0ID0gMTsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkRpc2FibGluZyBVLUFQU0QgaW4gRlcgZm9yIFNUQTogJWQgQUM6ICVkICIsCiAgICAgICAgICAgICB1Y1NUQUlkLCB1Y0FDKSk7CgogIC8qTm90aWZ5IEhBTCovCiAgV0RBX0Rpc2FibGVVYXBzZEFjUGFyYW1zKHB2b3NHQ3R4LCB1Y1NUQUlkLCB1Y0FDKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9EaXNhYmxlVUFQU0RGb3JBQyAqLwoKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICBXTEFOVExfUmVnUlNTSUluZGljYXRpb25DQgoKICBERVNDUklQVElPTiAgUmVnaXN0cmF0aW9uIGZ1bmN0aW9uIHRvIGdldCBub3RpZmljYXRpb24gaWYgUlNTSSBjcm9zcwogICAgICAgICAgICAgICB0aHJlc2hvbGQuCiAgICAgICAgICAgICAgIENsaWVudCBzaG91bGQgcmVnaXN0ZXIgdGhyZXNob2xkLCBkaXJlY3Rpb24sIGFuZCBub3RpZmljYXRpb24KICAgICAgICAgICAgICAgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgoKICBERVBFTkRFTkNJRVMgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICBpbiByc3NpVmFsdWUgLSBSU1NJIHRocmVzaG9sZCB2YWx1ZQogICAgICAgICAgICAgICBpbiB0cmlnZ2VyRXZlbnQgLSBDcm9zcyBkaXJlY3Rpb24gc2hvdWxkIGJlIG5vdGlmaWVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQLCBET1dOLCBhbmQgQ1JPU1MKICAgICAgICAgICAgICAgaW4gY3Jvc3NDQkZ1bmN0aW9uIC0gTm90aWZpY2F0aW9uIENCIEZ1bmN0aW9uCiAgICAgICAgICAgICAgIGluIHVzckN0eHQgLSB1c2VyIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX1JlZ1JTU0lJbmRpY2F0aW9uQ0IKKAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAogICB2X1M3X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc2lWYWx1ZSwKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQsCiAgIFdMQU5UTF9SU1NJQ3Jvc3NUaHJlc2hvbGRDQlR5cGUgY3Jvc3NDQkZ1bmN0aW9uLAogICBWT1NfTU9EVUxFX0lEICAgICAgICAgICAgICAgICAgIG1vZHVsZUlELAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgIHVzckN0eHQKKQp7CiAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CgogICBzdGF0dXMgPSBXTEFOVExfSFNSZWdSU1NJSW5kaWNhdGlvbkNCKHBBZGFwdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc2lWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3NDQkZ1bmN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzckN0eHQpOwoKICAgcmV0dXJuIHN0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICBXTEFOVExfRGVyZWdSU1NJSW5kaWNhdGlvbkNCCgogIERFU0NSSVBUSU9OICBSZW1vdmUgc3BlY2lmaWMgdGhyZXNob2xkIGZyb20gbGlzdAoKICBERVBFTkRFTkNJRVMgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICBpbiByc3NpVmFsdWUgLSBSU1NJIHRocmVzaG9sZCB2YWx1ZQogICAgICAgICAgICAgICBpbiB0cmlnZ2VyRXZlbnQgLSBDcm9zcyBkaXJlY3Rpb24gc2hvdWxkIGJlIG5vdGlmaWVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQLCBET1dOLCBhbmQgQ1JPU1MKICAgCiAgUkVUVVJOIFZBTFVFIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX0RlcmVnUlNTSUluZGljYXRpb25DQgooCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIHZfUzdfdCAgICAgICAgICAgICAgICAgICAgICAgICAgcnNzaVZhbHVlLAogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCwKICAgV0xBTlRMX1JTU0lDcm9zc1RocmVzaG9sZENCVHlwZSBjcm9zc0NCRnVuY3Rpb24sCiAgIFZPU19NT0RVTEVfSUQgICAgICAgICAgICAgICAgICAgbW9kdWxlSUQKKQp7CiAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CgogICBzdGF0dXMgPSBXTEFOVExfSFNEZXJlZ1JTU0lJbmRpY2F0aW9uQ0IocEFkYXB0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc3NpVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9zc0NCRnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVJRCk7CiAgIHJldHVybiBzdGF0dXM7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgV0xBTlRMX1NldEFscGhhCgogIERFU0NSSVBUSU9OICBBTFBMQSBpcyB3ZWlnaHQgdmFsdWUgdG8gY2FsY3VsYXRlIEFWRyBSU1NJCiAgICAgICAgICAgICAgIGF2Z1JTU0kgPSAoQUxQSEEgKiBoaXN0b3J5UlNTSSkgKyAoKDEwIC0gQUxQSEEpICogbmV3UlNTSSkKICAgICAgICAgICAgICAgYXZnUlNTSSBoYXMgKEFMUEhBICogMTApJSBvZiBoaXN0b3J5IFJTU0kgd2VpZ2h0IGFuZAogICAgICAgICAgICAgICAoMTAgLSBBTFBIQSklIG9mIG5ld1JTU0kgd2VpZ2h0CiAgICAgICAgICAgICAgIFRoaXMgcG9ydGlvbiBpcyBkeW5hbWljYWxseSBjb25maWd1cmFibGUuCiAgICAgICAgICAgICAgIERlZmF1bHQgaXMgPwoKICBERVBFTkRFTkNJRVMgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICBpbiB2YWx1ZUFscGFoIC0gQUxQSEEKICAgCiAgUkVUVVJOIFZBTFVFIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX1NldEFscGhhCigKICAgdl9QVk9JRF90IHBBZGFwdGVyLAogICB2X1U4X3QgICAgdmFsdWVBbHBoYQopCnsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKCiAgIHN0YXR1cyA9IFdMQU5UTF9IU1NldEFscGhhKHBBZGFwdGVyLCB2YWx1ZUFscGhhKTsKICAgcmV0dXJuIHN0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgRlVOQ1RJT04KCiAgIERFU0NSSVBUSU9OIAogICAgCiAgIFBBUkFNRVRFUlMgCgogICBSRVRVUk4gVkFMVUUKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9CTVBTUlNTSVJlZ2lvbkNoYW5nZWROb3RpZmljYXRpb24KKAogICB2X1BWT0lEX3QgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIHRwU2lyUlNTSU5vdGlmaWNhdGlvbiBwUlNTSU5vdGlmaWNhdGlvbgopCnsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKCiAgIHN0YXR1cyA9IFdMQU5UTF9IU0JNUFNSU1NJUmVnaW9uQ2hhbmdlZE5vdGlmaWNhdGlvbihwQWRhcHRlciwgcFJTU0lOb3RpZmljYXRpb24pOwogICByZXR1cm4gc3RhdHVzOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgIFdMQU5UTF9SZWdHZXRUcmFmZmljU3RhdHVzCgogIERFU0NSSVBUSU9OICBSZWdpc3RyYXRpb24gZnVuY3Rpb24gZm9yIHRyYWZmaWMgc3RhdHVzIG1vbml0b3JpbmcKICAgICAgICAgICAgICAgRHVyaW5nIG1lYXN1cmUgcGVyaW9kIGNvdW50IGRhdGEgZnJhbWVzLgogICAgICAgICAgICAgICBJZiBmcmFtZSBjb3VudCBpcyBsYXJnZXIgdGhlbiBJRExFIHRocmVzaG9sZCBzZXQgYXMgdHJhZmZpYyBPTgogICAgICAgICAgICAgICBvciBPRkYuCiAgICAgICAgICAgICAgIEFuZCB0cmFmZmljIHN0YXR1cyBpcyBjaGFuZ2VkIHNlbmQgcmVwb3J0IHRvIGNsaWVudCB3aXRoCiAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24KCiAgREVQRU5ERU5DSUVTIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKICAgICAgICAgICAgICAgaW4gaWRsZVRocmVzaG9sZCAtIFRyYWZmaWMgb24gb3Igb2ZmIHRocmVzaG9sZAogICAgICAgICAgICAgICBpbiBtZWFzdXJlUGVyaW9kIC0gVHJhZmZpYyBzdGF0ZSBjaGVjayBwZXJpb2QKICAgICAgICAgICAgICAgaW4gdHJmZmljU3RhdHVzQ0IgLSB0cmFmZmljIHN0YXR1cyBjaGFuZ2VkIG5vdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCIGZ1bmN0aW9uCiAgICAgICAgICAgICAgIGluIHVzckN0eHQgLSB1c2VyIGNvbnRleHQKICAgCiAgUkVUVVJOIFZBTFVFIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX1JlZ0dldFRyYWZmaWNTdGF0dXMKKAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAogICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkbGVUaHJlc2hvbGQsCiAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVBlcmlvZCwKICAgV0xBTlRMX1RyYWZmaWNTdGF0dXNDaGFuZ2VkQ0JUeXBlICB0cmZmaWNTdGF0dXNDQiwKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgICAgICB1c3JDdHh0CikKewogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwoKICAgc3RhdHVzID0gV0xBTlRMX0hTUmVnR2V0VHJhZmZpY1N0YXR1cyhwQWRhcHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGxlVGhyZXNob2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVQZXJpb2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJmZmljU3RhdHVzQ0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNyQ3R4dCk7CiAgIHJldHVybiBzdGF0dXM7Cn0KI2VuZGlmCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9HZXRTdGF0aXN0aWNzCgogIERFU0NSSVBUSU9OICAgR2V0IHRyYWZmaWMgc3RhdGlzdGljcyBmb3IgaWRlbnRpZmllZCBzdGF0aW9uIAoKICBERVBFTkRFTkNJRVMgIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCiAgICAgICAgICAgICAgICBpbiBzdGF0VHlwZSAtIHNwZWNpZmljIHN0YXRpc3RpY3MgZmllbGQgdG8gcmVzZXQKICAgICAgICAgICAgICAgIG91dCBzdGF0QnVmZmVyIC0gdHJhZmZpYyBzdGF0aXN0aWNzIGJ1ZmZlcgogICAKICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTICBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9HZXRTdGF0aXN0aWNzCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSAgKnN0YXRCdWZmZXIsCiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgIFNUQWlkCikKewogIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAqcFRMQ2IgID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgICBwQ2xpZW50U1RBID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRpc3RpY3MgPSBOVUxMOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIG9uIFdMQU5UTF9HZXRTdGF0aXN0aWNzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tTVEFpZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZigwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6ICVkIFNUQSBJRCBkb2VzIG5vdCBleGlzdCIsIFNUQWlkKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYoTlVMTCA9PSBzdGF0QnVmZmVyKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6SW52YWxpZCBUTCBzdGF0aXN0aWNzIGJ1ZmZlciBwb2ludGVyIG9uIFdMQU5UTF9HZXRTdGF0aXN0aWNzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIHN0YXRpc3RpY3MgPSAmcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3M7CiAgdm9zX21lbV9jb3B5KHN0YXRCdWZmZXIsIHN0YXRpc3RpY3MsIHNpemVvZihXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUpKTsKCiAgcmV0dXJuIHN0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX1Jlc2V0U3RhdGlzdGljcwoKICBERVNDUklQVElPTiAgIFJlc2V0IHN0YXRpc3RpY3Mgc3RydWN0dXJlIGZvciBpZGVudGlmaWVkIHN0YXRpb24gSUQKICAgICAgICAgICAgICAgIFJlc2V0IG1lYW5zIHNldCB2YWx1ZXMgYXMgMAoKICBERVBFTkRFTkNJRVMgIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCiAgICAgICAgICAgICAgICBpbiBzdGF0VHlwZSAtIHNwZWNpZmljIHN0YXRpc3RpY3MgZmllbGQgdG8gcmVzZXQKICAgCiAgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyAgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfUmVzZXRTdGF0aXN0aWNzCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgIFNUQWlkCikKewogIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAqcFRMQ2IgID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgICBwQ2xpZW50U1RBID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRpc3RpY3MgPSBOVUxMOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKE5VTEwgPT0gcFRMQ2IpIAogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgb24gV0xBTlRMX0dldFN0YXRpc3RpY3MiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW1NUQWlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmKDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMpCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDogJWQgU1RBIElEIGRvZXMgbm90IGV4aXN0IiwgU1RBaWQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBzdGF0aXN0aWNzID0gJnBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzOwogIHZvc19tZW1femVybygodl9WT0lEX3QgKilzdGF0aXN0aWNzLCBzaXplb2YoV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFKSk7CgogIHJldHVybiBzdGF0dXM7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9HZXRTcGVjU3RhdGlzdGljCgogIERFU0NSSVBUSU9OICAgR2V0IHNwZWNpZmljIGZpZWxkIHdpdGhpbiBzdGF0aXN0aWNzIHN0cnVjdHVyZSBmb3IKICAgICAgICAgICAgICAgIGlkZW50aWZpZWQgc3RhdGlvbiBJRCAKCiAgREVQRU5ERU5DSUVTICBOT05FCgogIFBBUkFNRVRFUlMgICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCiAgICAgICAgICAgICAgICBpbiBzdGF0VHlwZSAtIHNwZWNpZmljIHN0YXRpc3RpY3MgZmllbGQgdG8gcmVzZXQKICAgICAgICAgICAgICAgIGluIFNUQWlkICAgIC0gU3RhdGlvbiBJRAogICAgICAgICAgICAgICAgb3V0IGJ1ZmZlciAgLSBTdGF0aXN0aWMgdmFsdWUKICAgCiAgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyAgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfR2V0U3BlY1N0YXRpc3RpYwooCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIFdMQU5UTF9UUkFOU0ZFUl9TVEFUSUNfVFlQRSAgc3RhdFR5cGUsCiAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyLAogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgIFNUQWlkCikKewogIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAqcFRMQ2IgID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgICBwQ2xpZW50U1RBID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRpc3RpY3MgPSBOVUxMOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKE5VTEwgPT0gcFRMQ2IpIAogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgb24gV0xBTlRMX0dldFN0YXRpc3RpY3MiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbU1RBaWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYoMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cykKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOiAlZCBTVEEgSUQgZG9lcyBub3QgZXhpc3QiLCBTVEFpZCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmKE5VTEwgPT0gYnVmZmVyKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6SW52YWxpZCBUTCBzdGF0aXN0aWMgYnVmZmVyIHBvaW50ZXIgb24gV0xBTlRMX0dldFN0YXRpc3RpY3MiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgc3RhdGlzdGljcyA9ICZwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljczsKICBzd2l0Y2goc3RhdFR5cGUpCiAgewogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX1VDX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eFVDRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX01DX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eE1DRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX0JDX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eEJDRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX1VDX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eFVDQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX01DX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eE1DQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX0JDX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eEJDQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1VDX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeFVDRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX01DX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeE1DRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeEJDRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1VDX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeFVDQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX01DX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeE1DQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeEJDQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeEJjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ05UX0NSQ19PSzoKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnJ4QmNudENSQ29rOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfUkFURToKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnJ4UmF0ZTsKICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgKmJ1ZmZlciA9IDA7CiAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKICAgICAgYnJlYWs7CiAgfQoKCiAgcmV0dXJuIHN0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX1Jlc2V0U3BlY1N0YXRpc3RpYwoKICBERVNDUklQVElPTiAgIFJlc2V0IHNwZWNpZmljIGZpZWxkIHdpdGhpbiBzdGF0aXN0aWNzIHN0cnVjdHVyZSBmb3IKICAgICAgICAgICAgICAgIGlkZW50aWZpZWQgc3RhdGlvbiBJRAogICAgICAgICAgICAgICAgUmVzZXQgbWVhbnMgc2V0IGFzIDAKCiAgREVQRU5ERU5DSUVTICBOT05FCiAgICAKICBQQVJBTUVURVJTICAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICAgaW4gc3RhdFR5cGUgLSBzcGVjaWZpYyBzdGF0aXN0aWNzIGZpZWxkIHRvIHJlc2V0CiAgICAgICAgICAgICAgICBpbiBTVEFpZCAgICAtIFN0YXRpb24gSUQKCiAgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyAgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfUmVzZXRTcGVjU3RhdGlzdGljCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICBwQWRhcHRlciwKICAgV0xBTlRMX1RSQU5TRkVSX1NUQVRJQ19UWVBFICBzdGF0VHlwZSwKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICBTVEFpZAopCnsKICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgKnBUTENiICA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgICAgcENsaWVudFNUQSA9IE5VTEw7CiAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICpzdGF0aXN0aWNzID0gTlVMTDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmIChOVUxMID09IHBUTENiKSAKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIG9uIFdMQU5UTF9HZXRTdGF0aXN0aWNzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tTVEFpZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZigwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6ICVkIFNUQSBJRCBkb2VzIG5vdCBleGlzdCIsIFNUQWlkKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgc3RhdGlzdGljcyA9ICZwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljczsKICBzd2l0Y2goc3RhdFR5cGUpCiAgewogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX1VDX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4VUNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX01DX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4TUNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX0JDX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4QkNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX1VDX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4VUNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX01DX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4TUNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX0JDX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4QkNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1VDX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4VUNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX01DX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4TUNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4QkNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1VDX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4VUNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX01DX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4TUNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4QkNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4QmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ05UX0NSQ19PSzoKICAgICAgc3RhdGlzdGljcy0+cnhCY250Q1JDb2sgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfUkFURToKICAgICAgc3RhdGlzdGljcy0+cnhSYXRlID0gMDsKICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgICBicmVhazsKICB9CgogIHJldHVybiBzdGF0dXM7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICBGVU5DVElPTgoKICAgREVTQ1JJUFRJT04gICBSZWFkIFJTU0kgdmFsdWUgb3V0IG9mIGEgUlggQkQKICAgIAogICBQQVJBTUVURVJTOiAgQ2FsbGVyIG11c3QgdmFsaWRhdGUgYWxsIHBhcmFtZXRlcnMgCgogICBSRVRVUk4gVkFMVUUKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9SZWFkUlNTSQooCiAgIHZfUFZPSURfdCAgICAgICAgcEFkYXB0ZXIsCiAgIHZfUFZPSURfdCAgICAgICAgcEJESGVhZGVyLAogICB2X1U4X3QgICAgICAgICAgIFNUQWlkCikKewogICBXTEFOVExfQ2JUeXBlICAgKnRsQ3R4dCA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogICB2X1M3X3QgICAgICAgICAgIGN1cnJlbnRSU1NJLCBjdXJyZW50UlNTSTAsIGN1cnJlbnRSU1NJMTsKCgogICBpZihOVUxMID09IHRsQ3R4dCkKICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzIEludmFsaWQgVEwgaGFuZGxlIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICAgfQoKICAgaWYgKCBOVUxMID09IHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0gKQogICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgIH0KCiAgIGN1cnJlbnRSU1NJMCA9IFdMQU5UTF9HRVRSU1NJMChwQkRIZWFkZXIpOwogICBjdXJyZW50UlNTSTEgPSBXTEFOVExfR0VUUlNTSTEocEJESGVhZGVyKTsKICAgY3VycmVudFJTU0kgID0gKGN1cnJlbnRSU1NJMCA+IGN1cnJlbnRSU1NJMSkgPyBjdXJyZW50UlNTSTAgOiBjdXJyZW50UlNTSTE7CgogICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5yc3NpQXZnID0gY3VycmVudFJTU0k7CgogICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICBGVU5DVElPTgoKICAgREVTQ1JJUFRJT04gICBSZWFkIFNOUiB2YWx1ZSBvdXQgb2YgYSBSWCBCRAoKICAgUEFSQU1FVEVSUzogIENhbGxlciBtdXN0IHZhbGlkYXRlIGFsbCBwYXJhbWV0ZXJzCgogICBSRVRVUk4gVkFMVUUKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9SZWFkU05SCigKICAgdl9QVk9JRF90ICAgICAgICBwQWRhcHRlciwKICAgdl9QVk9JRF90ICAgICAgICBwQkRIZWFkZXIsCiAgIHZfVThfdCAgICAgICAgICAgU1RBaWQKKQp7CiAgIFdMQU5UTF9DYlR5cGUgICAqdGxDdHh0ID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgIHZfUzdfdCAgICAgICAgICAgY3VycmVudFNOUjsKCgogICBpZiAoTlVMTCA9PSB0bEN0eHQpCiAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgIiVzIEludmFsaWQgVEwgaGFuZGxlIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICAgfQoKICAgaWYgKE5VTEwgPT0gdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXSkKICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICB9CgogICBjdXJyZW50U05SID0gV0xBTlRMX0dFVFNOUihwQkRIZWFkZXIpOwoKICAgLyogU05SIHJlcG9ydGVkIGluIHRoZSBCdWZmZXIgRGVzY3JpcHRvciBpcyBzY2FsZWQgdXAgYnkgMihTTlIqMiksCiAgICAqIEdldCB0aGUgY29ycmVjdCBTTlIgdmFsdWUKICAgICovCiAgIGN1cnJlbnRTTlIgPSBjdXJyZW50U05SID4+IDE7CgogICAvKiBTTlIgcmVwb3J0ZWQgYnkgSFcgY2Fubm90IGJlIG1vcmUgdGhhbiAzNWRCIGR1ZSB0byBIVyBsaW1pdGF0aW9ucyAqLwogICBjdXJyZW50U05SID0gKFdMQU5UTF9NQVhfSFdfU05SID4gY3VycmVudFNOUiA/IGN1cnJlbnRTTlIgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9NQVhfSFdfU05SKTsKCiAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICIlczogc25yc3VtOiAlZCBzbnJpZHg6ICVkIHByZXZzbnJhdmc6ICVkIiwKICAgICAgICAgICBfX2Z1bmNfXywKICAgICAgICAgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJTdW0sCiAgICAgICAgICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25ySWR4LAogICAgICAgICAgIHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0tPnByZXZTbnJBdmcpKTsKCiAgIC8qIFRoZSBTTlIgcmV0dXJuZWQgZm9yIGFsbCBwdXJwb3NlcyBpcyB0aGUgYXZlcmFnZSBTTlIgb3ZlcgogICAgKiBXTEFOVExfTUFYX1NOUl9EQVRBX1NNQVBMRVMuV2hlbiBkYXRhIHNhbXBsZXMKICAgICogPiBXTEFOVExfTUFYX1NOUl9EQVRBX1NBTVBMRVMgYXJlIG9idGFpbmVkLAogICAgKiBzdG9yZSB0aGUgYXZlcmFnZSBvZiB0aGUgc2FtcGxlcyBpbiBwcmV2U25yQXZnCiAgICAqIGFuZCBzdGFydCBhIG5ldyBhdmVyYWdpbmcgd2luZG93LiBUaGUgcHJldlNuckF2ZyBpcyB1c2VkIHdoZW4KICAgICogZW5vdWdoIGRhdGEgc2FtcGxlcyBhcmUgbm90IGF2YWlsYWJsZSB3aGVuIGFwcGxpY2F0aW9ucwogICAgKiBhY3R1YWxseSBxdWVyeSBmb3IgU05SLgogICAgKgogICAgKiBTRUU6IFdMQU5UTF9HZXRTbnIoKQogICAgKi8KICAgaWYgKHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0tPnNucklkeCA+PSBXTEFOVExfTUFYX1NOUl9EQVRBX1NBTVBMRVMpCiAgIHsKICAgICAgIHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0tPnByZXZTbnJBdmcgPQogICAgICAgICAgICAgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJTdW0gLwogICAgICAgICAgICAgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJJZHg7CiAgICAgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJTdW0gPSAwOwogICAgICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25ySWR4ID0gMDsKICAgfQogICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJTdW0gKz0gY3VycmVudFNOUjsKICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25ySWR4ICs9IDE7CgogICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgovKgogREVTQ1JJUFRJT04gCiAgICBUTCByZXR1cm5zIHRoZSB3ZWlnaHQgY3VycmVudGx5IG1haW50YWluZWQgaW4gVEwuCiBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKCiBPVVQKICAgIHBBQ1dlaWdodHM6ICAgICBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSBmb3IgZmlsbGluZyBpbiB3ZWlnaHRzCgogUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCiovClZPU19TVEFUVVMgIApXTEFOVExfR2V0QUNXZWlnaHRzIAooIAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QqICAgICAgICAgICAgICAgcEFDV2VpZ2h0cwopCnsKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAgdl9VOF90ICAgICAgICAgIHVjSW5kZXg7IAogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBBQ1dlaWdodHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0QUNXZWlnaHRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldEFDV2VpZ2h0cyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTlRMX01BWF9BQyA7IHVjSW5kZXgrKykKICB7CiAgICBwQUNXZWlnaHRzW3VjSW5kZXhdID0gcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1t1Y0luZGV4XTsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCgoKLyoKIERFU0NSSVBUSU9OIAogICAgQ2hhbmdlIHRoZSB3ZWlnaHQgY3VycmVudGx5IG1haW50YWluZWQgYnkgVEwuCiBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKICAgIHBBQ1dlaWdodHM6ICAgICBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSBjb250YWluIHRoZSB3ZWlnaHRzIHRvIHVzZQoKCiBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVMKKi8KVk9TX1NUQVRVUyAgCldMQU5UTF9TZXRBQ1dlaWdodHMgCiggCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICAgICAgICAgICBwQUNXZWlnaHRzCikKewogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogICB2X1U4X3QgICAgICAgICAgdWNJbmRleDsgCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcEFDV2VpZ2h0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9HZXRBQ1dlaWdodHMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfR2V0QUNXZWlnaHRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOVExfTUFYX0FDIDsgdWNJbmRleCsrKQogIHsKICAgIHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNJbmRleF0gPSBwQUNXZWlnaHRzW3VjSW5kZXhdOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgIEZVTkNUSU9OCgogICBERVNDUklQVElPTiAKICAgIAogICBQQVJBTUVURVJTIAoKICAgUkVUVVJOIFZBTFVFCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdm9pZCBXTEFOVExfUG93ZXJTdGF0ZUNoYW5nZWRDQgooCiAgIHZfUFZPSURfdCBwQWRhcHRlciwKICAgdFBtY1N0YXRlIG5ld1N0YXRlCikKewogICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgICAgICp0bEN0eHQgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKCiAgIGlmIChOVUxMID09IHRsQ3R4dCkKICAgewogICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFRMIENvbnRyb2wgQmxvY2siLCBfX2Z1bmNfXyApOwogICAgIHJldHVybjsKICAgfQoKICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIlBvd2VyIHN0YXRlIGNoYW5nZWQsIG5ldyBzdGF0ZSBpcyAlZCIsIG5ld1N0YXRlICk7CiAgIHN3aXRjaChuZXdTdGF0ZSkKICAgewogICAgICBjYXNlIEZVTExfUE9XRVI6CiAgICAgICAgIHRsQ3R4dC0+aXNCTVBTID0gVk9TX0ZBTFNFOwogICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQk1QUzoKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICAgICAgICAgV0xBTlRMX1NldEZXUlNTSVRocmVzaG9sZHMocEFkYXB0ZXIpOwojZW5kaWYKCiAgICAgICAgIHRsQ3R4dC0+aXNCTVBTID0gVk9TX1RSVUU7CiAgICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBJTVBTOgogICAgICBjYXNlIExPV19QT1dFUjoKICAgICAgY2FzZSBSRVFVRVNUX0JNUFM6CiAgICAgIGNhc2UgUkVRVUVTVF9GVUxMX1BPV0VSOgogICAgICBjYXNlIFJFUVVFU1RfSU1QUzoKICAgICAgY2FzZSBTVE9QUEVEOgogICAgICBjYXNlIFJFUVVFU1RfU1RBUlRfVUFQU0Q6CiAgICAgIGNhc2UgUkVRVUVTVF9TVE9QX1VBUFNEOgogICAgICBjYXNlIFVBUFNEOgogICAgICBjYXNlIFJFUVVFU1RfU1RBTkRCWToKICAgICAgY2FzZSBTVEFOREJZOgogICAgICBjYXNlIFJFUVVFU1RfRU5URVJfV09XTDoKICAgICAgY2FzZSBSRVFVRVNUX0VYSVRfV09XTDoKICAgICAgY2FzZSBXT1dMOgogICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIk5vdCBoYW5kbGUgdGhpcyBldmVudHMgJWQiLCBuZXdTdGF0ZSApKTsKICAgICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgogICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJOb3QgYSB2YWxpZCBldmVudCAlZCIsIG5ld1N0YXRlICkpOwogICAgICAgICBicmVhazsKICAgfQoKICAgcmV0dXJuOwp9Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9HZXRFdGhlclR5cGUKCiAgREVTQ1JJUFRJT04gICBFeHRyYWN0IEV0aGVyIHR5cGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgQkQKCiAgREVQRU5ERU5DSUVTICBOT05FCiAgICAKICBQQVJBTUVURVJTICAgIGluIGF1Y0JESGVhZGVyIC0gQkQgaGVhZGVyCiAgICAgICAgICAgICAgICBpbiB2b3NEYXRhQnVmZiAtIGRhdGEgYnVmZmVyCiAgICAgICAgICAgICAgICBpbiB1Y01QRFVITGVuICAtIE1QRFUgaGVhZGVyIGxlbmd0aAogICAgICAgICAgICAgICAgb3V0IHBVc0V0aGVyVHlwZSAtIHBvaW50ZXIgdG8gRXRoZXJ0eXBlCgogIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVU19TVUNDRVNTIDogaWYgdGhlIEV0aGVyVHlwZSBpcyBzdWNjZXNzZnVsbHkgZXh0cmFjdGVkCiAgICAgICAgICAgICAgICBWT1NfU1RBVFVTX0ZBSUxVUkUgOiBpZiB0aGUgRXRoZXJUeXBlIGV4dHJhY3Rpb24gZmFpbGVkIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhY2tldCB3YXMgZHJvcHBlZAoKICBTSURFIEVGRkVDVFMgIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnN0YXRpYyBWT1NfU1RBVFVTIFdMQU5UTF9HZXRFdGhlclR5cGUKKAogICB2X1U4X3QgICAgICAgICAgICAgICAqIGF1Y0JESGVhZGVyLAogICB2b3NfcGt0X3QgICAgICAgICAgICAqIHZvc0RhdGFCdWZmLAogICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW4sCiAgIHZfVTE2X3QgICAgICAgICAgICAgICogcFVzRXRoZXJUeXBlCikKewogIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y09mZnNldDsKICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNFdGhlclR5cGUgPSAqcFVzRXRoZXJUeXBlOwogIHZfU0laRV90ICAgICAgICAgICAgICAgICB1c0xMQ1NpemUgPSBzaXplb2YodXNFdGhlclR5cGUpOwogIFZPU19TVEFUVVMgICAgICAgICAgICAgICB2b3NTdGF0dXMgID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiBMTEMgaXMgcHJlc2VudCAtIGlmIG5vdCwgVEwgaXMgdW5hYmxlIHRvIGRldGVybWluZSB0eXBlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBWT1NfRkFMU0UgPT0gV0RBX0lTX1JYX0xMQ19QUkVTRU5UKCBhdWNCREhlYWRlciApICkKICB7CiAgICB1Y09mZnNldCA9IFdMQU5UTF84MDJfM19IRUFERVJfTEVOIC0gc2l6ZW9mKHVzRXRoZXJUeXBlKTsgCiAgfQogIGVsc2UKICB7CiAgICB1Y09mZnNldCA9IHVjTVBEVUhMZW4gKyBXTEFOVExfTExDX1BST1RPX1RZUEVfT0ZGU0VUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgTExDIHR5cGUgCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NTdGF0dXMgPSB2b3NfcGt0X2V4dHJhY3RfZGF0YSggdm9zRGF0YUJ1ZmYsIHVjT2Zmc2V0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmdXNFdGhlclR5cGUsICZ1c0xMQ1NpemUpOyAKCiAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIHx8IAogICAgICAoIHNpemVvZih1c0V0aGVyVHlwZSkgIT0gdXNMTENTaXplICkpCiAgICAgIAogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6RXJyb3IgZXh0cmFjdGluZyBFdGhlciB0eXBlIGZyb20gZGF0YSBwYWNrZXQiKSk7CiAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KICBlbHNlCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6RXRoZXIgdHlwZSByZXRyaWV2ZWQgYmVmb3JlIGVuZGlhbmVzcyBjb252OiAlZCIsIAogICAgICAgICAgICAgICB1c0V0aGVyVHlwZSkpOwoKICAgIHVzRXRoZXJUeXBlID0gdm9zX2JlMTZfdG9fY3B1KHVzRXRoZXJUeXBlKTsKICAgICpwVXNFdGhlclR5cGUgPSB1c0V0aGVyVHlwZTsKCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpFdGhlciB0eXBlIHJldHJpZXZlZDogJWQiLCB1c0V0aGVyVHlwZSkpOwogIH0KICAKICByZXR1cm4gdm9zU3RhdHVzOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICBXTEFOVExfR2V0U29mdEFQU3RhdGlzdGljcwoKICBERVNDUklQVElPTiAgIENvbGxlY3QgdGhlIGN1bXVsYXRpdmUgc3RhdGlzdGljcyBmb3IgYWxsIFNvZnRhcCBzdGF0aW9ucwoKICBERVBFTkRFTkNJRVMgIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICAgaW4gcHZvc0dDdHggIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0CiAgICAgICAgICAgICAgICAgICBiUmVzZXQgICAgLSBJZiBzZXQgVEwgc3RhdGlzdGljcyB3aWxsIGJlIGNsZWFyZWQgYWZ0ZXIgcmVhZGluZwogICAgICAgICAgICAgICAgb3V0IHN0YXRzU3VtIC0gcG9pbnRlciB0byBjb2xsZWN0ZWQgc3RhdGlzdGljcwoKICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVNfU1VDQ0VTUyA6IGlmIHRoZSBTdGF0aXN0aWNzIGFyZSBzdWNjZXNzZnVsbHkgZXh0cmFjdGVkCgogIFNJREUgRUZGRUNUUyAgTk9ORQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX0dldFNvZnRBUFN0YXRpc3RpY3Modl9QVk9JRF90IHBBZGFwdGVyLCBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRzU3VtLCB2X0JPT0xfdCBiUmVzZXQpCnsKICAgIHZfVThfdCBpID0gMDsKICAgIFZPU19TVEFUVVMgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgIFdMQU5UTF9DYlR5cGUgKnBUTENiICA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogICAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFIHN0YXRCdWZmZXJUZW1wOwogICAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKSZzdGF0QnVmZmVyVGVtcCwgc2l6ZW9mKFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSkpOwogICAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKXN0YXRzU3VtLCBzaXplb2YoV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFKSk7CgoKICAgIGlmICggTlVMTCA9PSBwVExDYiApCiAgICB7CiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfSAKCiAgICAvLyBTdW0gdXAgYWxsIHRoZSBzdGF0aXN0aWNzIGZvciBzdGF0aW9ucyBvZiBTb2Z0IEFQIGZyb20gVEwKICAgIGZvciAoaSA9IDA7IGkgPCBXTEFOX01BWF9TVEFfQ09VTlQ7IGkrKykKICAgIHsKICAgICAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0pCiAgICAgICAgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT53U1RBRGVzYy53U1RBVHlwZSA9PSBXTEFOX1NUQV9TT0ZUQVApCiAgICAgICAgewogICAgICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9HZXRTdGF0aXN0aWNzKHBBZGFwdGVyLCAmc3RhdEJ1ZmZlclRlbXAsIGkpOy8vIENhbiBpbmNsdWRlIHN0YUlkIDEgYmVjYXVzZSBzdGF0aXN0aWNzIG5vdCBjb2xsZWN0ZWQgZm9yIGl0CgogICAgICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCiAgICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwoKICAgICAgICAgICAgLy8gQWRkIHRvIHRoZSBjb3VudGVycwogICAgICAgICAgIHN0YXRzU3VtLT50eFVDRmNudCArPSBzdGF0QnVmZmVyVGVtcC50eFVDRmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+dHhNQ0ZjbnQgKz0gc3RhdEJ1ZmZlclRlbXAudHhNQ0ZjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnR4QkNGY250ICs9IHN0YXRCdWZmZXJUZW1wLnR4QkNGY250OwogICAgICAgICAgIHN0YXRzU3VtLT50eFVDQmNudCArPSBzdGF0QnVmZmVyVGVtcC50eFVDQmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+dHhNQ0JjbnQgKz0gc3RhdEJ1ZmZlclRlbXAudHhNQ0JjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnR4QkNCY250ICs9IHN0YXRCdWZmZXJUZW1wLnR4QkNCY250OwogICAgICAgICAgIHN0YXRzU3VtLT5yeFVDRmNudCArPSBzdGF0QnVmZmVyVGVtcC5yeFVDRmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+cnhNQ0ZjbnQgKz0gc3RhdEJ1ZmZlclRlbXAucnhNQ0ZjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnJ4QkNGY250ICs9IHN0YXRCdWZmZXJUZW1wLnJ4QkNGY250OwogICAgICAgICAgIHN0YXRzU3VtLT5yeFVDQmNudCArPSBzdGF0QnVmZmVyVGVtcC5yeFVDQmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+cnhNQ0JjbnQgKz0gc3RhdEJ1ZmZlclRlbXAucnhNQ0JjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnJ4QkNCY250ICs9IHN0YXRCdWZmZXJUZW1wLnJ4QkNCY250OwoKICAgICAgICAgICBpZiAoYlJlc2V0KQogICAgICAgICAgIHsKICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfUmVzZXRTdGF0aXN0aWNzKHBBZGFwdGVyLCBpKTsKICAgICAgICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogICAgICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsgICAgICAgICAgICAgICAKICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHZvc1N0YXR1czsKfQojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFNfSU5URVJOQUwKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldEV0aGVyVHlwZV8yCgogIERFU0NSSVBUSU9OICAgRXh0cmFjdCBFdGhlciB0eXBlIGluZm9ybWF0aW9uIGZyb20gdGhlIEJECgogIERFUEVOREVOQ0lFUyAgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgICBpbiBhdWNCREhlYWRlciAtIEJEIGhlYWRlcgogICAgICAgICAgICAgICAgaW4gdm9zRGF0YUJ1ZmYgLSBkYXRhIGJ1ZmZlcgogICAgICAgICAgICAgICAgaW4gdWNNUERVSExlbiAgLSBNUERVIGhlYWRlciBsZW5ndGgKICAgICAgICAgICAgICAgIG91dCBwVXNFdGhlclR5cGUgLSBwb2ludGVyIHRvIEV0aGVydHlwZQoKICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVNfU1VDQ0VTUyA6IGlmIHRoZSBFdGhlclR5cGUgaXMgc3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZAogICAgICAgICAgICAgICAgVk9TX1NUQVRVU19GQUlMVVJFIDogaWYgdGhlIEV0aGVyVHlwZSBleHRyYWN0aW9uIGZhaWxlZCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYWNrZXQgd2FzIGRyb3BwZWQKCiAgU0lERSBFRkZFQ1RTICBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpzdGF0aWMgVk9TX1NUQVRVUyBXTEFOVExfR2V0RXRoZXJUeXBlXzIKKAogICB2X1U4X3QgICAgICAgICAgICAgICAqIGF1Y0JESGVhZGVyLAogICB2b3NfcGt0X3QgICAgICAgICAgICAqIHZvc0RhdGFCdWZmLAogICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW4sCiAgIHZfVTE2X3QgICAgICAgICAgICAgICogcFVzRXRoZXJUeXBlCikKewogIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y09mZnNldDsKICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNFdGhlclR5cGUgPSAqcFVzRXRoZXJUeXBlOwogIHZfU0laRV90ICAgICAgICAgICAgICAgICB1c0xMQ1NpemUgPSBzaXplb2YodXNFdGhlclR5cGUpOwogIFZPU19TVEFUVVMgICAgICAgICAgICAgICB2b3NTdGF0dXMgID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIC8vdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjTExDSGVhZGVyOwogIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y01QRFVIT2Zmc2V0IDsgCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIExMQyBpcyBwcmVzZW50IC0gaWYgbm90LCBUTCBpcyB1bmFibGUgdG8gZGV0ZXJtaW5lIHR5cGUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAvL3VjTVBEVUhPZmZzZXQgPSAodl9VOF90KVdMQU5IQUxfUlhfQkRfR0VUX01QRFVfSF9PRkZTRVQoYXVjQkRIZWFkZXIpIDsKICAvL3VjTExDSGVhZGVyICAgPSAodl9VOF90KVdMQU5IQUxfUlhfQkRfR0VUX0xMQyhhdWNCREhlYWRlcik7CiAgdWNNUERVSE9mZnNldCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9PRkZTRVQoYXVjQkRIZWFkZXIpOwoKICBpZiAoIFZPU19UUlVFID09IFdEQV9JU19SWF9MTENfUFJFU0VOVChhdWNCREhlYWRlcikgKQogIHsKICAgIHVjT2Zmc2V0ID0gdWNNUERVSE9mZnNldCArIFdMQU5UTF84MDJfM19IRUFERVJfTEVOIC0gc2l6ZW9mKHVzRXRoZXJUeXBlKTsgCiAgfQogIGVsc2UKICB7CiAgICB1Y09mZnNldCA9IFdMQU5IQUxfUlhfQkRfSEVBREVSX1NJWkUgKyB1Y01QRFVITGVuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTlRMX0xMQ19QUk9UT19UWVBFX09GRlNFVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IExMQyB0eXBlIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc0RhdGFCdWZmLCB1Y09mZnNldCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnVzRXRoZXJUeXBlLCAmdXNMTENTaXplKTsgCgogIC8qIFRPRE86IERvIGl0IGluIGJldHRlciB3YXkgKi8KICBpZih2b3NfYmUxNl90b19jcHUodXNFdGhlclR5cGUpID09IDB4ODkwZCkKICB7CiAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCiAgICAgICAgICAgICAgICAgICAgICAoIlRETFMgZnJhbWUgbGxjICV4IiksIHZvc19iZTE2X3RvX2NwdSh1c0V0aGVyVHlwZSkpIDsKICB9CiAgICAgIAogICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpFdGhlciB0eXBlIHJldHJpZXZlZCBiZWZvcmUgZW5kaWFuZXNzIGNvbnY6ICVkIiwgCiAgICAgICAgICAgICAgIHVzRXRoZXJUeXBlKTsKCiAgICB1c0V0aGVyVHlwZSA9IHZvc19iZTE2X3RvX2NwdSh1c0V0aGVyVHlwZSk7CiAgICAqcFVzRXRoZXJUeXBlID0gdXNFdGhlclR5cGU7CgogICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpFdGhlciB0eXBlIHJldHJpZXZlZDogJWQiLCB1c0V0aGVyVHlwZSk7CiAgCiAgcmV0dXJuIHZvc1N0YXR1czsKfQojZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX0lzUmVwbGF5UGFja2V0CiAgICAgCiAgREVTQ1JJUFRJT04gICBUaGlzIGZ1bmN0aW9uIGRvZXMgcmVwbGF5IGNoZWNrIGZvciB2YWxpZCBzdGF0aW9ucwogCiAgREVQRU5ERU5DSUVTICBWYWxpZGl0eSBvZiByZXBsYXkgY2hlY2sgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgZnVuY3Rpb24gCiAgICAgICAgICAgICAgICBpcyBjYWxsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAKICBQQVJBTUVURVJTICAgIGN1cnJlbnRSZXBsYXlDb3VudGVyICAgIGN1cnJlbnQgcmVwbGF5IGNvdW50ZXIgdGFrZW4gZnJvbSBSWCBCRCAKICAgICAgICAgICAgICAgIHByZXZpb3VzUmVwbGF5Q291bnRlciAgIHByZXZpb3VzIHJlcGxheSBjb3VudGVyIHRha2VuIGZyb20gVEwgQ0IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgUkVUUlVOICAgICAgICBWT1NfVFJVRSAgICBwYWNrZXQgaXMgYSByZXBsYXkgcGFja2V0CiAgICAgICAgICAgICAgICBWT1NfRkFMU0UgICBwYWNrZXQgaXMgbm90IGEgcmVwbGF5IHBhY2tldAoKICBTSURFIEVGRkVDVFMgICBub25lCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdl9CT09MX3QKV0xBTlRMX0lzUmVwbGF5UGFja2V0CigKICB2X1U2NF90ICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyLAogIHZfVTY0X3QgICAgdWxscHJldmlvdXNSZXBsYXlDb3VudGVyCikKewogICAvKiBEbyB0aGUgcmVwbGF5IGNoZWNrIGJ5IGNvbXBhcmluZyBwcmV2aW91cyByZWNlaXZlZCByZXBsYXkgY291bnRlciB3aXRoCiAgICAgIGN1cnJlbnQgcmVjZWl2ZWQgcmVwbGF5IGNvdW50ZXIqLwogICAgaWYodWxscHJldmlvdXNSZXBsYXlDb3VudGVyIDwgdWxsY3VycmVudFJlcGxheUNvdW50ZXIpCiAgICB7CiAgICAgICAgLyogVmFsaWQgcGFja2V0IG5vdCByZXBsYXkgKi8KICAgICAgICByZXR1cm4gVk9TX0ZBTFNFOwogICAgfQogICAgZWxzZQogICAgewoKICAgICAgICAvKiBDdXJyZW50IHBhY2tldCBudW1iZXIgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHByZXZpdW9zIHJlY2VpdmVkIAogICAgICAgICAgIHBhY2tldCBubywgdGhpcyBtZWFucyBjdXJyZW50IHBhY2tldCBpcyByZXBsYXkgcGFja2V0ICovCiAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6IFJlcGxheSBwYWNrZXQgZm91bmQgd2l0aCByZXBsYXkgY291bnRlciA6WzB4JWxsWF0iLHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKTsKICAgICAgICAgICAKICAgICAgICByZXR1cm4gVk9TX1RSVUU7CiAgICB9Cn0KCiNpZiAwCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldFJlcGxheUNvdW50ZXJGcm9tUnhCRAogICAgIAogIERFU0NSSVBUSU9OICAgVGhpcyBmdW5jdGlvbiBleHRyYWN0cyA0OC1iaXQgcmVwbGF5IHBhY2tldCBudW1iZXIgZnJvbSBSWCBCRCAKIAogIERFUEVOREVOQ0lFUyAgVmFsaWRpdHkgb2YgcmVwbGF5IGNoZWNrIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIGZ1bmN0aW9uIAogICAgICAgICAgICAgICAgaXMgY2FsbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgUEFSQU1FVEVSUyAgICBwdWNSeEhlYWRlciBwb2ludGVyIHRvIFJYIEJEIGhlYWRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBSRVRSVU4gICAgICAgIHZfVTY0X3QgICAgUGFja2V0IG51bWJlciBleHRhcmN0ZWQgZnJvbSBSWCBCRAoKICBTSURFIEVGRkVDVFMgICBub25lCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdl9VNjRfdApXTEFOVExfR2V0UmVwbGF5Q291bnRlckZyb21SeEJECigKICAgdl9VOF90ICpwdWNSeEJESGVhZGVyCikKewovKiA0OC1iaXQgcmVwbGF5IGNvdW50ZXIgaXMgY3JlYXRlZCBhcyBmb2xsb3dzCiAgIGZyb20gUlggQkQgNiBieXRlIFBNSSBjb21tYW5kOgogICBBZGRyIDogQUVTL1RLSVAKICAgMHgzOCA6IHBuMy90c2MzCiAgIDB4MzkgOiBwbjIvdHNjMgogICAweDNhIDogcG4xL3RzYzEKICAgMHgzYiA6IHBuMC90c2MwCgogICAweDNjIDogcG41L3RzYzUKICAgMHgzZCA6IHBuNC90c2M0ICovCgojaWZkZWYgQU5JX0JJR19CWVRFX0VORElBTgogICAgdl9VNjRfdCB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA9IDA7CiAgICAvKiBHZXR0aW5nIDQ4LWJpdCByZXBsYXkgY291bnRlciBmcm9tIHRoZSBSWCBCRCAqLwogICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSBXTEFOSEFMX1JYX0JEX0dFVF9QTUlDTURfMjBUTzIzKHB1Y1J4QkRIZWFkZXIpOyAKICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyIDw8PSAxNjsKICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyIHw9ICgoIFdMQU5IQUxfUlhfQkRfR0VUX1BNSUNNRF8yNFRPMjUocHVjUnhCREhlYWRlcikgJiAweEZGRkYwMDAwKSA+PiAxNik7CiAgICByZXR1cm4gdWxsY3VycmVudFJlcGxheUNvdW50ZXI7CiNlbHNlCiAgICB2X1U2NF90IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyID0gMDsKICAgIC8qIEdldHRpbmcgNDgtYml0IHJlcGxheSBjb3VudGVyIGZyb20gdGhlIFJYIEJEICovCiAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA9IChXTEFOSEFMX1JYX0JEX0dFVF9QTUlDTURfMjRUTzI1KHB1Y1J4QkRIZWFkZXIpICYgMHgwMDAwRkZGRik7IAogICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPDw9IDMyOyAKICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyIHw9IFdMQU5IQUxfUlhfQkRfR0VUX1BNSUNNRF8yMFRPMjMocHVjUnhCREhlYWRlcik7IAogICAgcmV0dXJuIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOwojZW5kaWYKfQojZW5kaWYKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX1Bvc3RSZXNOZWVkZWQKICAgICAKICBERVNDUklQVElPTiAgIFRoaXMgZnVuY3Rpb24gcG9zdHMgbWVzc2FnZSB0byBUTCB0byByZXNlcnZlIEJEL1BEVSBtZW1vcnkKIAogIERFUEVOREVOQ0lFUyAgTm9uZQogICAgICAgICAgICAgICAgICAgICAgICAgIAogIFBBUkFNRVRFUlMgICAgcHZvc0dDdHgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgUkVUVVJOICAgICAgICBOb25lCgogIFNJREUgRUZGRUNUUyAgIG5vbmUKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdm9pZCBXTEFOVExfUG9zdFJlc05lZWRlZCh2X1BWT0lEX3QgcHZvc0dDdHgpCnsKICB2b3NfbXNnX3QgICAgICAgICAgICB2b3NNc2c7CgogIHZvc01zZy5yZXNlcnZlZCA9IDA7CiAgdm9zTXNnLmJvZHlwdHIgID0gTlVMTDsKICB2b3NNc2cudHlwZSAgICAgPSBXTEFOVExfVFhfUkVTX05FRURFRDsKICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgIldMQU4gVEw6IEJEL1BEVSBhdmFpbGFibGUgaW50ZXJydXB0IHJlY2VpdmVkLCBQb3N0aW5nIG1lc3NhZ2UgdG8gVEwiKTsKICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc190eF9tcV9zZXJpYWxpemUoIFZPU19NUV9JRF9UTCwgJnZvc01zZykpKQogIHsKICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAiICVzIGZhaWxzIHRvIHBvc3QgbWVzc2FnZSIsIF9fZnVuY19fKTsKICB9Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgIFdMQU5UTF9VcGRhdGVSc3NpQm1wcwoKICBERVNDUklQVElPTiAgICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIFRMJ3MgUlNTSSAoaW4gQk1QUyBtb2RlKQoKICBERVBFTkRFTkNJRVMgICBOb25lCgogIFBBUkFNRVRFUlMKCiAgICBwdm9zR0N0eCAgICAgICAgIFZPUyBjb250ZXh0ICAgICAgICAgIFZPUyBHbG9iYWwgY29udGV4dAogICAgc3RhSWQgICAgICAgICAgICBTdGF0aW9uIElEICAgICAgICAgICBTdGF0aW9uIElECiAgICByc3NpICAgICAgICAgICAgIFJTU0kgKEJNUFMgbW9kZSkgICAgIFJTU0kgaW4gQk1QUyBtb2RlCgogIFJFVFVSTiAgICAgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTICAgbm9uZQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgp2b2lkIFdMQU5UTF9VcGRhdGVSc3NpQm1wcyh2X1BWT0lEX3QgcHZvc0dDdHgsIHZfVThfdCBzdGFJZCwgdl9TN190IHJzc2kpCnsKICBXTEFOVExfQ2JUeXBlKiBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwoKICBpZiAoTlVMTCAhPSBwVExDYiAmJiBOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YUlkXSkKICB7CiAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFJZF0tPnJzc2lBdmdCbXBzID0gcnNzaTsKICB9Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgIFdMQU5UTF9VcGRhdGVTbnJCbXBzCgogIERFU0NSSVBUSU9OICAgIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgVEwncyBTTlIgKGluIEJNUFMgbW9kZSkKCiAgREVQRU5ERU5DSUVTICAgTm9uZQoKICBQQVJBTUVURVJTCgogICAgcHZvc0dDdHggICAgICAgICBWT1MgY29udGV4dCAgICAgICAgICBWT1MgR2xvYmFsIGNvbnRleHQKICAgIHN0YUlkICAgICAgICAgICAgU3RhdGlvbiBJRCAgICAgICAgICAgU3RhdGlvbiBJRAogICAgc25yICAgICAgICAgICAgIFNOUiAoQk1QUyBtb2RlKSAgICAgU05SIGluIEJNUFMgbW9kZQoKICBSRVRVUk4gICAgICAgICBOb25lCgogIFNJREUgRUZGRUNUUyAgIG5vbmUKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdm9pZCBXTEFOVExfVXBkYXRlU25yQm1wcyh2X1BWT0lEX3QgcHZvc0dDdHgsIHZfVThfdCBzdGFJZCwgdl9TN190IHNucikKewogIFdMQU5UTF9DYlR5cGUqIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CgogIGlmIChOVUxMICE9IHBUTENiICYmIE5VTEwgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhSWRdKQogIHsKICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YUlkXS0+c25yQXZnQm1wcyA9IHNucjsKICB9Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgIFdMQU5UTF9VcGRhdGVMaW5rQ2FwYWNpdHkKCiAgREVTQ1JJUFRJT04gICAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBTVEEncyBMaW5rIENhcGFjaXR5IGluIFRMCgogIERFUEVOREVOQ0lFUyAgIE5vbmUKCiAgUEFSQU1FVEVSUwoKICAgIHB2b3NHQ3R4ICAgICAgICAgVk9TIGNvbnRleHQgICAgICAgICAgVk9TIEdsb2JhbCBjb250ZXh0CiAgICBzdGFJZCAgICAgICAgICAgIFN0YXRpb24gSUQgICAgICAgICAgIFN0YXRpb24gSUQKICAgIGxpbmtDYXBhY2l0eSAgICAgbGlua0NhcGFjaXR5ICAgICAgICAgTGluayBDYXBhY2l0eQoKICBSRVRVUk4gICAgICAgICBOb25lCgogIFNJREUgRUZGRUNUUyAgIG5vbmUKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdm9pZCBXTEFOVExfVXBkYXRlTGlua0NhcGFjaXR5KHZfUFZPSURfdCBwdm9zR0N0eCwgdl9VOF90IHN0YUlkLCB2X1UzMl90IGxpbmtDYXBhY2l0eSkKewogICAgV0xBTlRMX0NiVHlwZSogcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKCiAgICBpZiAoTlVMTCAhPSBwVExDYiAmJiBOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YUlkXSkKICAgIHsKICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFJZF0tPmxpbmtDYXBhY2l0eSA9IGxpbmtDYXBhY2l0eTsKICAgIH0KfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRTVEFMaW5rQ2FwYWNpdHkKCiAgREVTQ1JJUFRJT04KCiAgICBSZXR1cm5zIExpbmsgQ2FwYWNpdHkgb2YgYSBwYXJ0aWN1bGFyIFNUQS4KCiAgREVQRU5ERU5DSUVTCgogICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIGl0cyBzdGF0ZSBjYW4gYmUgcmV0cmlldmVkLgoKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uCgogICAgT1VUCiAgICBwbGlua0NhcGFjaXR5OiAgdGhlIGN1cnJlbnQgbGluayBjYXBhY2l0eSB0aGUgY29ubmVjdGlvbiB0bwogICAgICAgICAgICAgICAgICAgIHRoZSBnaXZlbiBzdGF0aW9uCgoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgdG8KICAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0dldFNUQUxpbmtDYXBhY2l0eQooCiAgICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKICAgIHZfVTMyX3QgICAgICAgICAgICAgICAqcGxpbmtDYXBhY2l0eQopCnsKICAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBTYW5pdHkgY2hlY2sKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYgKCBOVUxMID09IHBsaW5rQ2FwYWNpdHkgKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgRkwoIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIiKSkpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICB9CgogICAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQiKSkpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICAgIGlmICggTlVMTCA9PSBwVExDYiApCiAgICB7CiAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IikpKTsKICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIH0KCiAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgRkwoIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCIpKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgfQoKICAgIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMgKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIikpKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBHZXQgU1RBIHN0YXRlCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICpwbGlua0NhcGFjaXR5ID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPmxpbmtDYXBhY2l0eTsKCiAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0dldFNUQUxpbmtDYXBhY2l0eSAqLwo=