PERSQUZUIT4KCQkJSE9XVE8gcHJveHkgY2VydGlmaWNhdGVzCgowLiBXQVJOSU5HCgpOT05FIE9GIFRIRSBDT0RFIFBSRVNFTlRFRCBIRVJFIEhBVkUgQkVFTiBDSEVDS0VEISAgVGhleSBhcmUganVzdCBhbgpleGFtcGxlIHRvIHNob3cgeW91IGhvdyB0aGluZ3MgY2FuIGJlIGRvbmUuICBUaGVyZSBtYXkgYmUgdHlwb3Mgb3IKdHlwZSBjb25mbGljdHMsIGFuZCB5b3Ugd2lsbCBoYXZlIHRvIHJlc29sdmUgdGhlbS4KCjEuIEludHJvZHVjdGlvbgoKUHJveHkgY2VydGlmaWNhdGVzIGFyZSBkZWZpbmVkIGluIFJGQyAzODIwLiAgVGhleSBhcmUgcmVhbGx5IHVzdWFsCmNlcnRpZmljYXRlcyB3aXRoIHRoZSBtYW5kYXRvcnkgZXh0ZW5zaW9uIHByb3h5Q2VydEluZm8uCgpQcm94eSBjZXJ0aWZpY2F0ZXMgYXJlIGlzc3VlZCBieSBhbiBFbmQgRW50aXR5ICh0eXBpY2FsbHkgYSB1c2VyKSwKZWl0aGVyIGRpcmVjdGx5IHdpdGggdGhlIEVFIGNlcnRpZmljYXRlIGFzIGlzc3VpbmcgY2VydGlmaWNhdGUsIG9yIGJ5CmV4dGVuc2lvbiB0aHJvdWdoIGFuIGFscmVhZHkgaXNzdWVkIHByb3h5IGNlcnRpZmljYXRlLi4gIFRoZXkgYXJlIHVzZWQKdG8gZXh0ZW5kIHJpZ2h0cyB0byBzb21lIG90aGVyIGVudGl0eSAoYSBjb21wdXRlciBwcm9jZXNzLCB0eXBpY2FsbHksCm9yIHNvbWV0aW1lcyB0byB0aGUgdXNlciBpdHNlbGYpLCBzbyBpdCBjYW4gcGVyZm9ybSBvcGVyYXRpb25zIGluIHRoZQpuYW1lIG9mIHRoZSBvd25lciBvZiB0aGUgRUUgY2VydGlmaWNhdGUuCgpTZWUgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzgyMC50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCgoKMi4gQSB3YXJuaW5nIGFib3V0IHByb3h5IGNlcnRpZmljYXRlcwoKTm9vbmUgc2VlbXMgdG8gaGF2ZSB0ZXN0ZWQgcHJveHkgY2VydGlmaWNhdGVzIHdpdGggc2VjdXJpdHkgaW4gbWluZC4KQmFzaWNhbGx5LCB0byB0aGlzIGRhdGUsIGl0IHNlZW1zIHRoYXQgcHJveHkgY2VydGlmaWNhdGVzIGhhdmUgb25seQpiZWVuIHVzZWQgaW4gYSB3b3JsZCB0aGF0J3MgaGlnaGx5IGF3YXJlIG9mIHRoZW0uICBXaGF0IHdvdWxkIGhhcHBlbgppZiBhbiB1bnN1c3BlY3RpbmcgYXBwbGljYXRpb24gaXMgdG8gdmFsaWRhdGUgYSBjaGFpbiBvZiBjZXJ0aWZpY2F0ZXMKdGhhdCBjb250YWlucyBwcm94eSBjZXJ0aWZpY2F0ZXM/ICBJdCB3b3VsZCB1c3VhbGx5IGNvbnNpZGVyIHRoZSBsZWFmCnRvIGJlIHRoZSBjZXJ0aWZpY2F0ZSB0byBjaGVjayBmb3IgYXV0aG9yaXNhdGlvbiBkYXRhLCBhbmQgc2luY2UgcHJveHkKY2VydGlmaWNhdGVzIGFyZSBjb250cm9sbGVkIGJ5IHRoZSBFRSBjZXJ0aWZpY2F0ZSBvd25lciBhbG9uZSwgaXQncwp3b3VsZCBiZSBub3JtYWwgdG8gY29uc2lkZXIgd2hhdCB0aGUgRUUgY2VydGlmaWNhdGUgb3duZXIgY291bGQgZG8Kd2l0aCB0aGVtLgoKc3ViamVjdEFsdE5hbWUgYW5kIGlzc3VlckFsdE5hbWUgYXJlIGZvcmJpZGRlbiBpbiBwcm94eSBjZXJ0aWZpY2F0ZXMsCmFuZCB0aGlzIGlzIGVuZm9yY2VkIGluIE9wZW5TU0wuICBUaGUgc3ViamVjdCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZQppc3N1ZXIsIHdpdGggb25lIGNvbW1vbk5hbWUgYWRkZWQgb24uCgpQb3NzaWJsZSB0aHJlYXRzIGFyZSwgYXMgZmFyIGFzIGhhcyBiZWVuIGltYWdpbmVkIHNvIGZhcjoKCiAtIGltcGVyc29uYXRpb24gdGhyb3VnaCBjb21tb25OYW1lICh0aGluayBzZXJ2ZXIgY2VydGlmaWNhdGVzKS4KIC0gdXNlIG9mIGFkZGl0aW9uYWwgZXh0ZW5zaW9ucywgcG9zc2libHkgbm9uLXN0YW5kYXJkIG9uZXMgdXNlZCBpbgogICBjZXJ0YWluIGVudmlyb25tZW50cywgdGhhdCB3b3VsZCBncmFudCBleHRyYSBvciBkaWZmZXJlbnQKICAgYXV0aG9yaXNhdGlvbiByaWdodHMuCgpGb3IgdGhpcyByZWFzb24sIE9wZW5TU0wgcmVxdWlyZXMgdGhhdCB0aGUgdXNlIG9mIHByb3h5IGNlcnRpZmljYXRlcwpiZSBleHBsaWNpdGVseSBhbGxvd2VkLiAgQ3VycmVudGx5LCB0aGlzIGNhbiBiZSBkb25lIHVzaW5nIHRoZQpmb2xsb3dpbmcgbWV0aG9kczoKCiAtIGlmIHRoZSBhcHBsaWNhdGlvbiBjYWxscyBYNTA5X3ZlcmlmeV9jZXJ0KCkgaXRzZWxmLCBpdCBjYW4gZG8gdGhlCiAgIGZvbGxvd2luZyBwcmlvciB0byB0aGF0IGNhbGwgKGN0eCBpcyB0aGUgcG9pbnRlciBwYXNzZWQgaW4gdGhlIGNhbGwKICAgdG8gWDUwOV92ZXJpZnlfY2VydCgpKToKCglYNTA5X1NUT1JFX0NUWF9zZXRfZmxhZ3MoY3R4LCBYNTA5X1ZfRkxBR19BTExPV19QUk9YWV9DRVJUUyk7CgogLSBpbiBhbGwgb3RoZXIgY2FzZXMsIHByb3h5IGNlcnRpZmljYXRlIHZhbGlkYXRpb24gY2FuIGJlIGVuYWJsZWQKICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBhcHBsaWNhdGlvbiBieSBzZXR0aW5nIHRoZSBlbnZpcm5vbWVudCB2YXJpYWJsZQogICBPUEVOU1NMX0FMTE9XX1BST1hZIHdpdGggc29tZSBub24tZW1wdHkgdmFsdWUuCgpUaGVyZSBhcmUgdGhvdWdodHMgdG8gYWxsb3cgcHJveHkgY2VydGlmaWNhdGVzIHdpdGggYSBsaW5lIGluIHRoZQpkZWZhdWx0IG9wZW5zc2wuY25mLCBidXQgdGhhdCdzIHN0aWxsIGluIHRoZSBmdXR1cmUuCgoKMy4gSG93IHRvIGNyZWF0ZSBwcm94eSBjZXJpZmljYXRlcwoKSXQncyBxdWl0ZSBlYXN5IHRvIGNyZWF0ZSBwcm94eSBjZXJ0aWZpY2F0ZXMsIGJ5IHRha2luZyBhZHZhbnRhZ2Ugb2YKdGhlIGxhY2sgb2YgY2hlY2tzIG9mIHRoZSAnb3BlbnNzbCB4NTA5JyBhcHBsaWNhdGlvbiAoKmFoZW0qKS4gIEJ1dApmaXJzdCwgeW91IG5lZWQgdG8gY3JlYXRlIGEgY29uZmlndXJhdGlvbiBzZWN0aW9uIHRoYXQgY29udGFpbnMgYQpkZWZpbml0aW9uIG9mIHRoZSBwcm94eUNlcnRJbmZvIGV4dGVuc2lvbiwgYSBsaXR0bGUgbGlrZSB0aGlzOgoKICBbIHYzX3Byb3h5IF0KICAjIEEgcHJveHkgY2VydGlmaWNhdGUgTVVTVCBORVZFUiBiZSBhIENBIGNlcnRpZmljYXRlLgogIGJhc2ljQ29uc3RyYWludHM9Q0E6RkFMU0UKCiAgIyBVc3VhbCBhdXRob3JpdHkga2V5IElECiAgYXV0aG9yaXR5S2V5SWRlbnRpZmllcj1rZXlpZCxpc3N1ZXI6YWx3YXlzCgogICMgTm93LCBmb3IgdGhlIGV4dGVuc2lvbiB0aGF0IG1hcmtzIHRoaXMgY2VydGlmaWNhdGUgYXMgYSBwcm94eSBvbmUKICBwcm94eUNlcnRJbmZvPWNyaXRpY2FsLGxhbmd1YWdlOmlkLXBwbC1hbnlMYW5ndWFnZSxwYXRobGVuOjEscG9saWN5OnRleHQ6QUIKCkl0J3MgYWxzbyBwb3NzaWJsZSB0byBnaXZlIHRoZSBwcm94eSBleHRlbnNpb24gaW4gYSBzZXBhcmF0ZSBzZWN0aW9uOgoKICBwcm94eUNlcnRJbmZvPWNyaXRpY2FsLEBwcm94eV9leHQKCiAgWyBwcm94eV9leHQgXQogIGxhbmd1YWdlPWlkLXBwbC1hbnlMYW5ndWFnZQogIHBhdGhsZW49MAogIHBvbGljeT10ZXh0OkJDCgpUaGUgcG9saWN5IHZhbHVlIGhhcyBhIHNwZWNpZmljIHN5bnRheCwge3N5bnRhZ306e3N0cmluZ30sIHdoZXJlIHRoZQpzeW50YWcgZGV0ZXJtaW5lcyB3aGF0IHdpbGwgYmUgZG9uZSB3aXRoIHRoZSBzdHJpbmcuICBUaGUgcmVjb2duaXNlZApzeW50YWdzIGFyZSBhcyBmb2xsb3dzOgoKICB0ZXh0CWluZGljYXRlcyB0aGF0IHRoZSBzdHJpbmcgaXMgc2ltcGx5IHRoZSBieXRlcywgbm90CgllbmNvZGVkIGluIGFueSBraW5kIG9mIHdheToKCgkJcG9saWN5PXRleHQ6cuRrc232cmflcwoKCVByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgZGVzaWduIGhhZCBhIHNwZWNpZmljIHRhZwoJZm9yIFVURi04IHRleHQuICBIb3dldmVyLCBzaW5jZSB0aGUgYnl0ZXMgYXJlIGNvcGllZAoJYXMtaXMgYW55d2F5LCB0aGVyZSdzIG5vIG5lZWQgZm9yIGl0LiAgSW5zdGVhZCwgdXNlCgl0aGUgdGV4dDogdGFnLCBsaWtlIHRoaXM6CgoJCXBvbGljeT10ZXh0OnLDpGtzbcO2cmfDpXMKCiAgaGV4CWluZGljYXRlcyB0aGUgc3RyaW5nIGlzIGVuY29kZWQgaW4gaGV4LCB3aXRoIGNvbG9ucwoJYmV0d2VlbiBlYWNoIGJ5dGUgKGV2ZXJ5IHNlY29uZCBoZXggZGlnaXQpOgoKCQlwb2xpY3k9aGV4OjcyOkU0OjZCOjczOjZEOkY2OjcyOjY3OkU1OjczCgoJUHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBkZXNpZ24gaGFkIGEgdGFnIHRvIGluc2VydCBhCgljb21wbGV0ZSBERVIgYmxvYi4gIEhvd2V2ZXIsIHRoZSBvbmx5IGxlZ2FsIHVzZSBmb3IKCXRoaXMgd291bGQgYmUgdG8gc3Vycm91bmQgdGhlIGJ5dGVzIHRoYXQgd291bGQgZ28gd2l0aAoJdGhlIGhleDogdGFnIHdpdGggd2hhdCdzIG5lZWRlZCB0byBjb25zdHJ1Y3QgYSBjb3JyZWN0CglPQ1RFVCBTVFJJTkcuICBTaW5jZSBoZXg6IGRvZXMgdGhhdCwgdGhlIERFUiB0YWcgZmVsdAoJc3VwZXJmbHVvdXMsIGFuZCB3YXMgdGhlcmVmb3JlIHJlbW92ZWQuCgogIGZpbGUJaW5kaWNhdGVzIHRoYXQgdGhlIHRleHQgb2YgdGhlIHBvbGljeSBzaG91bGQgcmVhbGx5IGJlCgl0YWtlbiBmcm9tIGEgZmlsZS4gIFRoZSBzdHJpbmcgaXMgdGhlbiByZWFsbHkgYSBmaWxlCgluYW1lLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHBvbGljaWVzIHRoYXQgYXJlIGxhcmdlCgkobW9yZSB0aGFuIGEgZmV3IG9mIGxpbmVzKSBYTUwgZG9jdW1lbnRzLCBmb3IgZXhhbXBsZS4KClRoZSAncG9saWN5JyBzZXR0aW5nIGNhbiBiZSBzcGxpdCB1cCBpbiBtdWx0aXBsZSBsaW5lcyBsaWtlIHRoaXM6CgogIDAucG9saWN5PVRoaXMgaXMKICAxLnBvbGlzeT0gYSBtdWx0aS0KICAyLnBvbGljeT1saW5lIHBvbGljeS4KCk5PVEU6IHRoZSBwcm94eSBwb2xpY3kgdmFsdWUgaXMgdGhlIHBhcnQgdGhhdCBkZXRlcm1pbmVzIHRoZSByaWdodHMKZ3JhbnRlZCB0byB0aGUgcHJvY2VzcyB1c2luZyB0aGUgcHJveHkgY2VydGlmaWNhdGUuICBUaGUgdmFsdWUgaXMKY29tcGxldGVseSBkZXBlbmRlbnQgb24gdGhlIGFwcGxpY2F0aW9uIHJlYWRpbmcgYW5kIGludGVycHJldHRpbmcgaXQhCgpOb3cgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGFuIGV4dGVuc2lvbiBzZWN0aW9uIGZvciB5b3VyIHByb3h5CmNlcnRpZmljYXRlLCB5b3UgY2FuIG5vdyBlYXNpbHkgY3JlYXRlIGEgcHJveHkgY2VydGlmaWNhdGUgbGlrZSB0aGlzOgoKICBvcGVuc3NsIHJlcSAtbmV3IC1jb25maWcgb3BlbnNzbC5jbmYgXAoJICAtb3V0IHByb3h5LnJlcSAta2V5b3V0IHByb3h5LmtleQogIG9wZW5zc2wgeDUwOSAtcmVxIC1DQWNyZWF0ZXNlcmlhbCAtaW4gcHJveHkucmVxIC1kYXlzIDcgXAoJICAtb3V0IHByb3h5LmNydCAtQ0EgdXNlci5jcnQgLUNBa2V5IHVzZXIua2V5IFwKCSAgLWV4dGZpbGUgb3BlbnNzbC5jbmYgLWV4dGVuc2lvbnMgdjNfcHJveHkKCkl0J3MganVzdCBhcyBlYXN5IHRvIGNyZWF0ZSBhIHByb3h5IGNlcnRpZmljYXRlIHVzaW5nIGFub3RoZXIgcHJveHkKY2VydGlmaWNhdGUgYXMgaXNzdWVyIChub3RlIHRoYXQgSSdtIHVzaW5nIGEgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24Kc2VjdGlvbiBmb3IgaXQpOgoKICBvcGVuc3NsIHJlcSAtbmV3IC1jb25maWcgb3BlbnNzbC5jbmYgXAoJICAtb3V0IHByb3h5Mi5yZXEgLWtleW91dCBwcm94eTIua2V5CiAgb3BlbnNzbCB4NTA5IC1yZXEgLUNBY3JlYXRlc2VyaWFsIC1pbiBwcm94eTIucmVxIC1kYXlzIDcgXAoJICAtb3V0IHByb3h5Mi5jcnQgLUNBIHByb3h5LmNydCAtQ0FrZXkgcHJveHkua2V5IFwKCSAgLWV4dGZpbGUgb3BlbnNzbC5jbmYgLWV4dGVuc2lvbnMgdjNfcHJveHkyCgoKNC4gSG93IHRvIGhhdmUgeW91ciBhcHBsaWNhdGlvbiBpbnRlcnByZXQgdGhlIHBvbGljeT8KClRoZSBiYXNpYyB3YXkgdG8gaW50ZXJwcmV0IHByb3h5IHBvbGljaWVzIGlzIHRvIHByZXBhcmUgc29tZSBkZWZhdWx0CnJpZ2h0cywgdGhlbiBkbyBhIGNoZWNrIG9mIHRoZSBwcm94eSBjZXJ0aWZpY2F0ZSBhZ2FpbnN0IHRoZSBhIGNoYWluCm9mIHByb3h5IGNlcnRpZmljYXRlcywgdXNlciBjZXJ0aWZpY2F0ZSBhbmQgQ0EgY2VydGlmaWNhdGVzLCBhbmQgc2VlCndoYXQgcmlnaHRzIGNhbWUgb3V0IGJ5IHRoZSBlbmQuICBTb3VuZHMgZWFzeSwgaHVoPyAgSXQgYWxtb3N0IGlzLgoKVGhlIHNsaWdodGx5IGNvbXBsaWNhdGVkIHBhcnQgaXMgaG93IHRvIHBhc3MgZGF0YSBiZXR3ZWVuIHlvdXIKYXBwbGljYXRpb24gYW5kIHRoZSBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uIHByb2NlZHVyZS4KCllvdSBuZWVkIHRoZSBmb2xsb3dpbmcgaW5ncmVkaWVudHM6CgogLSBhIGNhbGxiYWNrIHJvdXRpbmcgdGhhdCB3aWxsIGJlIGNhbGxlZCBmb3IgZXZlcnkgY2VydGlmaWNhdGUgdGhhdCdzCiAgIHZhbGlkYXRlZC4gIEl0IHdpbGwgYmUgY2FsbGVkIHNldmVyYWwgdGltZXMgZm9yIGVhY2ggY2VydGlmaWNhdGVzLAogICBzbyB5b3UgbXVzdCBiZSBhdHRlbnRpdmUgdG8gd2hlbiBpdCdzIGEgZ29vZCB0aW1lIHRvIGRvIHRoZSBwcm94eQogICBwb2xpY3kgaW50ZXJwcmV0YXRpb24gYW5kIGNoZWNrLCBhcyB3ZWxsIGFzIHRvIGZpbGwgaW4gdGhlIGRlZmF1bHRzCiAgIHdoZW4gdGhlIEVFIGNlcnRpZmljYXRlIGlzIGNoZWNrZWQuCgogLSBhIHN0cnVjdHVyZSBvZiBkYXRhIHRoYXQncyBzaGFyZWQgYmV0d2VlbiB5b3VyIGFwcGxpY2F0aW9uIGNvZGUgYW5kCiAgIHRoZSBjYWxsYmFjay4KCiAtIGEgd3JhcHBlciBmdW5jdGlvbiB0aGF0IHNldHMgaXQgYWxsIHVwLgoKIC0gYW4gZXhfZGF0YSBpbmRleCBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gaW5kZXggaW50byB0aGUgZ2VuZXJpYwogICBleF9kYXRhIHN0b3JlIHRoYXQncyBhdHRhY2hlZCB0byBhbiBYNTA5IHZhbGlkYXRpb24gY29udGV4dC4KClRoaXMgaXMgc29tZSBjb29rYm9vayBjb2RlIGZvciB5b3UgdG8gZmlsbCBpbjoKCiAgLyogSW4gdGhpcyBleGFtcGxlLCBJIHdpbGwgdXNlIGEgdmlldyBvZiBncmFudGVkIHJpZ2h0cyBhcyBhIGJpdAogICAgIGFycmF5LCBvbmUgYml0IGZvciBlYWNoIHBvc3NpYmxlIHJpZ2h0LiAgKi8KICB0eXBlZGVmIHN0cnVjdCB5b3VyX3JpZ2h0cyB7CiAgICB1bnNpZ25lZCBjaGFyIHJpZ2h0c1t0b3RhbF9yaWdodHMgLyA4XTsKICB9IFlPVVJfUklHSFRTOwoKICAvKiBUaGUgZm9sbG93aW5nIHByb2NlZHVyZSB3aWxsIGNyZWF0ZSBhbiBpbmRleCBmb3IgdGhlIGV4X2RhdGEKICAgICBzdG9yZSBpbiB0aGUgWDUwOSB2YWxpZGF0aW9uIGNvbnRleHQgdGhlIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQuCiAgICAgU3Vic2VxdWVudCBjYWxscyB3aWxsIHJldHVybiB0aGUgc2FtZSBpbmRleC4gICovCiAgc3RhdGljIGludCBnZXRfcHJveHlfYXV0aF9leF9kYXRhX2lkeCh2b2lkKQogIHsKICAgIHN0YXRpYyB2b2xhdGlsZSBpbnQgaWR4ID0gLTE7CiAgICBpZiAoaWR4IDwgMCkKICAgICAgewogICAgICAgIENSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CiAgICAgICAgaWYgKGlkeCA8IDApCiAgICAgICAgICB7CiAgICAgICAgICAgIGlkeCA9IFg1MDlfU1RPUkVfQ1RYX2dldF9leF9uZXdfaW5kZXgoMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHZlcmlmeSBjYWxsYmFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwpOwogICAgICAgICAgfQogICAgICAgIENSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19YNTA5X1NUT1JFKTsKICAgICAgfQogICAgcmV0dXJuIGlkeDsKICB9CgogIC8qIENhbGxiYWNrIHRvIGJlIGdpdmVuIHRvIHRoZSBYNTA5IHZhbGlkYXRpb24gcHJvY2VkdXJlLiAgKi8KICBzdGF0aWMgaW50IHZlcmlmeV9jYWxsYmFjayhpbnQgb2ssIFg1MDlfU1RPUkVfQ1RYICpjdHgpCiAgewogICAgaWYgKG9rID09IDEpIC8qIEl0J3MgUkVBTExZIGltcG9ydGFudCB5b3Uga2VlcCB0aGUgcHJveHkgcG9saWN5CiAgICAgICAgICAgICAgICAgICAgY2hlY2sgd2l0aGluIHRoaXMgc2VjaW9uLiAgSXQncyBpbXBvcnRhbnQgdG8ga25vdwogICAgICAgICAgICAgICAgICAgIHRoYXQgd2hlbiBvayBpcyAxLCB0aGUgY2VydGlmaWNhdGVzIGFyZSBjaGVja2VkCiAgICAgICAgICAgICAgICAgICAgZnJvbSB0b3AgdG8gYm90dG9tLiAgWW91IGdldCB0aGUgQ0Egcm9vdCBmaXJzdCwKICAgICAgICAgICAgICAgICAgICBmb2xsb3dlZCBieSB0aGUgcG9zc2libGUgY2hhaW4gb2YgaW50ZXJtZWRpYXRlCiAgICAgICAgICAgICAgICAgICAgQ0FzLCBmb2xsb3dlZCBieSB0aGUgRUUgY2VydGlmaWNhdGUsIGZvbGxvd2VkIGJ5CiAgICAgICAgICAgICAgICAgICAgdGhlIHBvc3NpYmxlIHByb3h5IGNlcnRpZmljYXRlcy4gICovCiAgICAgIHsKICAgICAgICBYNTA5ICp4cyA9IGN0eC0+Y3VycmVudF9jZXJ0OwoKICAgICAgICBpZiAoeHMtPmV4X2ZsYWdzICYgRVhGTEFHX1BST1hZKQogICAgICAgICAgewoJICAgIFlPVVJfUklHSFRTICpyaWdodHMgPQogICAgICAgICAgICAgIChZT1VSX1JJR0hUUyAqKVg1MDlfU1RPUkVfQ1RYX2dldF9leF9kYXRhKGN0eCwKICAgICAgICAgICAgICAgIGdldF9wcm94eV9hdXRoX2V4X2RhdGFfaWR4KCkpOwogICAgICAgICAgICBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OICpwY2kgPQogICAgICAgICAgICAgIFg1MDlfZ2V0X2V4dF9kMmkoeHMsIE5JRF9wcm94eUNlcnRJbmZvLCBOVUxMLCBOVUxMKTsKCiAgICAgICAgICAgIHN3aXRjaCAoT0JKX29iajJuaWQocGNpLT5wcm94eVBvbGljeS0+cG9saWN5TGFuZ3VhZ2UpKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjYXNlIE5JRF9JbmRlcGVuZGVudDoKICAgICAgICAgICAgICAgIC8qIERvIHdoYXRldmVyIHlvdSBuZWVkIHRvIGdyYW50IGV4cGxpY2l0IHJpZ2h0cyB0bwogICAgICAgICAgICAgICAgICAgdGhpcyBwYXJ0aWN1bGFyIHByb3h5IGNlcnRpZmljYXRlLCB1c3VhbGx5IGJ5CiAgICAgICAgICAgICAgICAgICBwdWxsaW5nIHRoZW0gZnJvbSBzb21lIGRhdGFiYXNlLiAgSWYgdGhlcmUgYXJlIG5vbmUKICAgICAgICAgICAgICAgICAgIHRvIGJlIGZvdW5kLCBjbGVhciBhbGwgcmlnaHRzIChtYWtpbmcgdGhpcyBhbmQgYW55CiAgICAgICAgICAgICAgICAgICBzdWJzZXF1ZW50IHByb3h5IGNlcnRpZmljYXRlIHZvaWQgb2YgYW55IHJpZ2h0cykuCiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbWVtc2V0KHJpZ2h0cy0+cmlnaHRzLCAwLCBzaXplb2YocmlnaHRzLT5yaWdodHMpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgTklEX2lkX3BwbF9pbmhlcml0QWxsOgogICAgICAgICAgICAgICAgLyogVGhpcyBpcyBiYXNpY2FsbHkgYSBOT1AsIHdlIHNpbXBseSBsZXQgdGhlIGN1cnJlbnQKICAgICAgICAgICAgICAgICAgIHJpZ2h0cyBzdGFuZCBhcyB0aGV5IGFyZS4gKi8KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIHVzdWFsbHkgdGhlIG1vc3QgY29tcGxleCBzZWN0aW9uIG9mIGNvZGUuCiAgICAgICAgICAgICAgICAgICBZb3UgcmVhbGx5IGRvIHdoYXRldmVyIHlvdSB3YW50IGFzIGxvbmcgYXMgeW91CiAgICAgICAgICAgICAgICAgICBmb2xsb3cgUkZDIDM4MjAuICBJbiB0aGUgZXhhbXBsZSB3ZSB1c2UgaGVyZSwgdGhlCiAgICAgICAgICAgICAgICAgICBzaW1wbGVzdCB0aGluZyB0byBkbyBpcyB0byBidWlsZCBhbm90aGVyLCB0ZW1wb3JhcnkKICAgICAgICAgICAgICAgICAgIGJpdCBhcnJheSBhbmQgZmlsbCBpdCB3aXRoIHRoZSByaWdodHMgZ3JhbnRlZCBieQogICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgcHJveHkgY2VydGlmaWNhdGUsIHRoZW4gdXNlIGl0IGFzIGEKICAgICAgICAgICAgICAgICAgIG1hc2sgb24gdGhlIGFjY3VtdWxhdGVkIHJpZ2h0cyBiaXQgYXJyYXksIGFuZAogICAgICAgICAgICAgICAgICAgdm9pbOAsIHlvdSBub3cgaGF2ZSBhIG5ldyBhY2N1bXVsYXRlZCByaWdodHMgYml0CiAgICAgICAgICAgICAgICAgICBhcnJheS4gICovCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGludCBpOwogICAgICAgICAgICAgICAgICBZT1VSX1JJR0hUUyB0bXBfcmlnaHRzOwoJCSAgbWVtc2V0KHRtcF9yaWdodHMucmlnaHRzLCAwLCBzaXplb2YodG1wX3JpZ2h0cy5yaWdodHMpKTsKCiAgICAgICAgICAgICAgICAgIC8qIHByb2Nlc3NfcmlnaHRzKCkgaXMgc3VwcG9zZWQgdG8gYmUgYSBwcm9jZWR1cmUKICAgICAgICAgICAgICAgICAgICAgdGhhdCB0YWtlcyBhIHN0cmluZyBhbmQgaXQncyBsZW5ndGgsIGludGVycHJldHMKICAgICAgICAgICAgICAgICAgICAgaXQgYW5kIHNldHMgdGhlIGJpdHMgaW4gdGhlIFlPVVJfUklHSFRTIHBvaW50ZWQKICAgICAgICAgICAgICAgICAgICAgYXQgYnkgdGhlIHRoaXJkIGFyZ3VtZW50LiAgKi8KICAgICAgICAgICAgICAgICAgcHJvY2Vzc19yaWdodHMoKGNoYXIgKikgcGNpLT5wcm94eVBvbGljeS0+cG9saWN5LT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2ktPnByb3h5UG9saWN5LT5wb2xpY3ktPmxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcF9yaWdodHMpOwoKICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgdG90YWxfcmlnaHRzIC8gODsgaSsrKQogICAgICAgICAgICAgICAgICAgIHJpZ2h0cy0+cmlnaHRzW2ldICY9IHRtcF9yaWdodHMucmlnaHRzW2ldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OX2ZyZWUocGNpKTsKICAgICAgICAgIH0KICAgICAgICBlbHNlIGlmICghKHhzLT5leF9mbGFncyAmIEVYRkxBR19DQSkpCiAgICAgICAgICB7CiAgICAgICAgICAgIC8qIFdlIGhhdmUgYSBFRSBjZXJ0aWZpY2F0ZSwgbGV0J3MgdXNlIGl0IHRvIHNldCBkZWZhdWx0IQogICAgICAgICAgICAqLwoJICAgIFlPVVJfUklHSFRTICpyaWdodHMgPQogICAgICAgICAgICAgIChZT1VSX1JJR0hUUyAqKVg1MDlfU1RPUkVfQ1RYX2dldF9leF9kYXRhKGN0eCwKICAgICAgICAgICAgICAgIGdldF9wcm94eV9hdXRoX2V4X2RhdGFfaWR4KCkpOwoKICAgICAgICAgICAgLyogVGhlIGZvbGxvd2luZyBwcm9jZWR1cmUgZmluZHMgb3V0IHdoYXQgcmlnaHRzIHRoZSBvd25lcgogICAgICAgICAgICAgICBvZiB0aGUgY3VycmVudCBjZXJ0aWZpY2F0ZSBoYXMsIGFuZCBzZXRzIHRoZW0gaW4gdGhlCiAgICAgICAgICAgICAgIFlPVVJfUklHSFRTIHN0cnVjdHVyZSBwb2ludGVkIGF0IGJ5IHRoZSBzZWNvbmQKICAgICAgICAgICAgICAgYXJndW1lbnQuICAqLwogICAgICAgICAgICBzZXRfZGVmYXVsdF9yaWdodHMoeHMsIHJpZ2h0cyk7CiAgICAgICAgICB9CiAgICAgIH0KICAgIHJldHVybiBvazsKICB9CgogIHN0YXRpYyBpbnQgbXlfWDUwOV92ZXJpZnlfY2VydChYNTA5X1NUT1JFX0NUWCAqY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZT1VSX1JJR0hUUyAqbmVlZGVkX3JpZ2h0cykKICB7CiAgICBpbnQgaTsKICAgIGludCAoKnNhdmVfdmVyaWZ5X2NiKShpbnQgb2ssWDUwOV9TVE9SRV9DVFggKmN0eCkgPSBjdHgtPnZlcmlmeV9jYjsKICAgIFlPVVJfUklHSFRTIHJpZ2h0czsKCiAgICBYNTA5X1NUT1JFX0NUWF9zZXRfdmVyaWZ5X2NiKGN0eCwgdmVyaWZ5X2NhbGxiYWNrKTsKICAgIFg1MDlfU1RPUkVfQ1RYX3NldF9leF9kYXRhKGN0eCwgZ2V0X3Byb3h5X2F1dGhfZXhfZGF0YV9pZHgoKSwgJnJpZ2h0cyk7CiAgICBYNTA5X1NUT1JFX0NUWF9zZXRfZmxhZ3MoY3R4LCBYNTA5X1ZfRkxBR19BTExPV19QUk9YWV9DRVJUUyk7CiAgICBvayA9IFg1MDlfdmVyaWZ5X2NlcnQoY3R4KTsKCiAgICBpZiAob2sgPT0gMSkKICAgICAgewogICAgICAgIG9rID0gY2hlY2tfbmVlZGVkX3JpZ2h0cyhyaWdodHMsIG5lZWRlZF9yaWdodHMpOwogICAgICB9CgogICAgWDUwOV9TVE9SRV9DVFhfc2V0X3ZlcmlmeV9jYihjdHgsIHNhdmVfdmVyaWZ5X2NiKTsKCiAgICByZXR1cm4gb2s7CiAgfQoKSWYgeW91IHVzZSBTU0wgb3IgVExTLCB5b3UgY2FuIGVhc2lseSBzZXQgdXAgYSBjYWxsYmFjayB0byBoYXZlIHRoZQpjZXJ0aWZpY2F0ZXMgY2hlY2tlZCBwcm9wZXJseSwgdXNpbmcgdGhlIGNvZGUgYWJvdmU6CgogIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrKHNfY3R4LCBteV9YNTA5X3ZlcmlmeV9jZXJ0LCAmbmVlZGVkX3JpZ2h0cyk7CgoKLS0gClJpY2hhcmQgTGV2aXR0ZQo=