Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAovLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQoKI2lmbmRlZiBfRlBERkRPQ19IXwojZGVmaW5lIF9GUERGRE9DX0hfCgojaW5jbHVkZSAiZnBkZnZpZXcuaCIKCi8vIEV4cG9ydGVkIEZ1bmN0aW9ucwojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB7CiNlbmRpZgoKLy8gRnVuY3Rpb246IEZQREZCb29rbWFya19GaW5kCi8vCQkJRmluZCBhIGJvb2ttYXJrIGluIHRoZSBkb2N1bWVudCwgdXNpbmcgdGhlIGJvb2ttYXJrIHRpdGxlLgovLyBQYXJhbWV0ZXJzOiAKLy8JCQlkb2N1bWVudAktCUhhbmRsZSB0byB0aGUgZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IG9yIEZQREZfTG9hZE1lbURvY3VtZW50LgovLwkJCXRpdGxlCQktCVRoZSBVVEYtMTZMRSBlbmNvZGVkIFVuaWNvZGUgc3RyaW5nIGZvciB0aGUgYm9va21hcmsgdGl0bGUgdG8gYmUgc2VhcmNoZWQuIENhbid0IGJlIE5VTEwuCi8vIFJldHVybiB2YWx1ZToKLy8JCQlIYW5kbGUgdG8gdGhlIGZvdW5kIGJvb2ttYXJrIGl0ZW0uIE5VTEwgaWYgdGhlIHRpdGxlIGNhbid0IGJlIGZvdW5kLgovLyBDb21tZW50czoKLy8JCQlJdCBhbHdheXMgcmV0dXJucyB0aGUgZmlyc3QgZm91bmQgYm9va21hcmsgaWYgbW9yZSB0aGFuIG9uZSBib29rbWFya3MgaGF2ZSB0aGUgc2FtZSB0aXRsZS4KLy8KRExMRVhQT1JUIEZQREZfQk9PS01BUksgU1REQ0FMTCBGUERGQm9va21hcmtfRmluZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREVTVFJJTkcgdGl0bGUpOwoKLy8gRnVuY3Rpb246IEZQREZCb29rbWFya19HZXREZXN0Ci8vCQkJR2V0IHRoZSBkZXN0aW5hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBib29rbWFyayBpdGVtLgovLyBQYXJhbWV0ZXJzOgovLwkJCWRvY3VtZW50CS0JSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4KLy8JCQlib29rbWFyawktCUhhbmRsZSB0byB0aGUgYm9va21hcmsuCi8vIFJldHVybiB2YWx1ZToKLy8JCQlIYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGRhdGEuIE5VTEwgaWYgbm8gZGVzdGluYXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYm9va21hcmsuCi8vCkRMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0JPT0tNQVJLIGJvb2ttYXJrKTsKCi8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfR2V0QWN0aW9uCi8vCQkJR2V0IHRoZSBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIGEgYm9va21hcmsgaXRlbS4KLy8gUGFyYW1ldGVyczoKLy8JCQlib29rbWFyawktCUhhbmRsZSB0byB0aGUgYm9va21hcmsuCi8vIFJldHVybiB2YWx1ZToKLy8JCQlIYW5kbGUgdG8gdGhlIGFjdGlvbiBkYXRhLiBOVUxMIGlmIG5vIGFjdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBib29rbWFyay4gSW4gdGhpcyBjYXNlLCB0aGUgCi8vCQkJYXBwbGljYXRpb24gc2hvdWxkIHRyeSBGUERGQm9va21hcmtfR2V0RGVzdC4KLy8KRExMRVhQT1JUIEZQREZfQUNUSU9OIFNURENBTEwgRlBERkJvb2ttYXJrX0dldEFjdGlvbihGUERGX0JPT0tNQVJLIGJvb2ttYXJrKTsKCiNkZWZpbmUgUERGQUNUSU9OX1VOU1VQUE9SVEVECQkwCQkvLyBVbnN1cHBvcnRlZCBhY3Rpb24gdHlwZS4KI2RlZmluZSBQREZBQ1RJT05fR09UTwkJCQkxCQkvLyBHbyB0byBhIGRlc3RpbmF0aW9uIHdpdGhpbiBjdXJyZW50IGRvY3VtZW50LgojZGVmaW5lIFBERkFDVElPTl9SRU1PVEVHT1RPCQkyCQkvLyBHbyB0byBhIGRlc3RpbmF0aW9uIHdpdGhpbiBhbm90aGVyIGRvY3VtZW50LgojZGVmaW5lIFBERkFDVElPTl9VUkkJCQkJMwkJLy8gVW5pdmVyc2FsIFJlc291cmNlIElkZW50aWZpZXIsIGluY2x1ZGluZyB3ZWIgcGFnZXMgYW5kIAoJCQkJCQkJCQkJCS8vIG90aGVyIEludGVybmV0IGJhc2VkIHJlc291cmNlcy4KI2RlZmluZSBQREZBQ1RJT05fTEFVTkNICQkJNAkJLy8gTGF1bmNoIGFuIGFwcGxpY2F0aW9uIG9yIG9wZW4gYSBmaWxlLgoKLy8gRnVuY3Rpb246IEZQREZBY3Rpb25fR2V0VHlwZQovLwkJCUdldCB0eXBlIG9mIGFuIGFjdGlvbi4KLy8gUGFyYW1ldGVyczoKLy8JCQlhY3Rpb24JCS0JSGFuZGxlIHRvIHRoZSBhY3Rpb24uCi8vIFJldHVybiB2YWx1ZToKLy8JCQlBIHR5cGUgbnVtYmVyIGFzIGRlZmluZWQgYWJvdmUuCi8vCkRMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkFjdGlvbl9HZXRUeXBlKEZQREZfQUNUSU9OIGFjdGlvbik7CgovLyBGdW5jdGlvbjogRlBERkFjdGlvbl9HZXREZXN0Ci8vCQkJR2V0IGRlc3RpbmF0aW9uIG9mIGFuIGFjdGlvbi4KLy8gUGFyYW1ldGVyczoKLy8JCQlkb2N1bWVudAktCUhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCi8vCQkJYWN0aW9uCQktCUhhbmRsZSB0byB0aGUgYWN0aW9uLiBJdCBtdXN0IGJlIGEgR09UTyBvciBSRU1PVEVHT1RPIGFjdGlvbi4KLy8gUmV0dXJuIHZhbHVlOgovLwkJCUhhbmRsZSB0byB0aGUgZGVzdGluYXRpb24gZGF0YS4KLy8gQ29tbWVudHM6Ci8vCQkJSW4gY2FzZSBvZiByZW1vdGUgZ290byBhY3Rpb24sIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZmlyc3QgdXNlIEZQREZBY3Rpb25fR2V0RmlsZVBhdGggdG8KLy8JCQlnZXQgZmlsZSBwYXRoLCB0aGVuIGxvYWQgdGhhdCBwYXJ0aWN1bGFyIGRvY3VtZW50LCBhbmQgdXNlIGl0cyBkb2N1bWVudCBoYW5kbGUgdG8gY2FsbCB0aGlzCi8vCQkJZnVuY3Rpb24uCi8vCkRMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGQWN0aW9uX0dldERlc3QoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9BQ1RJT04gYWN0aW9uKTsKCi8vIEZ1bmN0aW9uOiBGUERGQWN0aW9uX0dldFVSSVBhdGgKLy8JCQlHZXQgVVJJIHBhdGggb2YgYSBVUkkgYWN0aW9uLgovLyBQYXJhbWV0ZXJzOgovLwkJCWRvY3VtZW50CS0JSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4KLy8JCQlhY3Rpb24JCS0JSGFuZGxlIHRvIHRoZSBhY3Rpb24uIE11c3QgYmUgYSBVUkkgYWN0aW9uLgovLwkJCWJ1ZmZlcgkJLQlBIGJ1ZmZlciBmb3Igb3V0cHV0IHRoZSBwYXRoIHN0cmluZy4gQ2FuIGJlIE5VTEwuCi8vCQkJYnVmbGVuCQktCVRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLiBDYW4gYmUgMC4KLy8gUmV0dXJuIHZhbHVlOgovLwkJCU51bWJlciBvZiBieXRlcyB0aGUgVVJJIHBhdGggY29uc3VtZXMsIGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvcy4KLy8gQ29tbWVudHM6Ci8vCQkJVGhlIFVSSSBwYXRoIGlzIGFsd2F5cyBlbmNvZGVkIGluIDctYml0IEFTQ0lJLgovLyAKLy8JCQlUaGUgcmV0dXJuIHZhbHVlIGFsd2F5cyBpbmRpY2F0ZWQgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgYnVmZmVyLCBldmVuIHdoZW4gdGhlcmUgaXMKLy8JCQlubyBidWZmZXIgc3BlY2lmaWVkLCBvciB0aGUgYnVmZmVyIHNpemUgaXMgbGVzcyB0aGVuIHJlcXVpcmVkLiBJbiB0aGlzIGNhc2UsIHRoZSBidWZmZXIgd2lsbCBub3QKLy8JCQliZSBtb2RpZmllZC4KLy8KRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGQWN0aW9uX0dldFVSSVBhdGgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9BQ1RJT04gYWN0aW9uLCAKCQkJCQkJCQkJCQkJCSAgdm9pZCogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGJ1Zmxlbik7CgovLyBGdW5jdGlvbjogRlBERkRlc3RfR2V0UGFnZUluZGV4Ci8vCQkJR2V0IHBhZ2UgaW5kZXggb2YgYSBkZXN0aW5hdGlvbi4KLy8gUGFyYW1ldGVyczoKLy8JCQlkb2N1bWVudAktCUhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCi8vCQkJZGVzdAkJLQlIYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uLgovLyBSZXR1cm4gdmFsdWU6Ci8vCQkJVGhlIHBhZ2UgaW5kZXguIFN0YXJ0aW5nIGZyb20gMCBmb3IgdGhlIGZpcnN0IHBhZ2UuCi8vCkRMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkRlc3RfR2V0UGFnZUluZGV4KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfREVTVCBkZXN0KTsKCi8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRMaW5rQXRQb2ludAovLwkJCUZpbmQgYSBsaW5rIGF0IHNwZWNpZmllZCBwb2ludCBvbiBhIGRvY3VtZW50IHBhZ2UuCi8vIFBhcmFtZXRlcnM6Ci8vCQkJcGFnZQkJLQlIYW5kbGUgdG8gdGhlIGRvY3VtZW50IHBhZ2UuCi8vCQkJeAkJCS0JVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQsIHNwZWNpZmllZCBpbiBwYWdlIGNvb3JkaW5hdGUgc3lzdGVtLgovLwkJCXkJCQktCVRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LCBzcGVjaWZpZWQgaW4gcGFnZSBjb29yZGluYXRlIHN5c3RlbS4KLy8gUmV0dXJuIHZhbHVlOgovLwkJCUhhbmRsZSB0byB0aGUgbGluay4gTlVMTCBpZiBubyBsaW5rIGZvdW5kIGF0IHRoYXQgcG9pbnQuCi8vIENvbW1lbnRzOgovLwkJCVRoZSBwb2ludCBjb29yZGluYXRlcyBhcmUgc3BlY2lmaWVkIGluIHBhZ2UgY29vcmRpbmF0ZSBzeXN0ZW0uIFlvdSBjYW4gY29udmVydCBjb29yZGluYXRlcyAKLy8JCQlmcm9tIHNjcmVlbiBzeXN0ZW0gdG8gcGFnZSBzeXN0ZW0gdXNpbmcgRlBERl9EZXZpY2VUb1BhZ2UgZnVuY3Rpb25zLgovLwpETExFWFBPUlQgRlBERl9MSU5LIFNURENBTEwgRlBERkxpbmtfR2V0TGlua0F0UG9pbnQoRlBERl9QQUdFIHBhZ2UsIGRvdWJsZSB4LCBkb3VibGUgeSk7CgovLyBGdW5jdGlvbjogRlBERkxpbmtfR2V0RGVzdAovLwkJCUdldCBkZXN0aW5hdGlvbiBpbmZvIG9mIGEgbGluay4KLy8gUGFyYW1ldGVyczoKLy8JCQlkb2N1bWVudAktCUhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCi8vCQkJbGluawkJLQlIYW5kbGUgdG8gdGhlIGxpbmsuIFJldHVybmVkIGJ5IEZQREZMaW5rX0dldExpbmtBdFBvaW50LgovLyBSZXR1cm4gdmFsdWU6Ci8vCQkJSGFuZGxlIHRvIHRoZSBkZXN0aW5hdGlvbi4gTlVMTCBpZiB0aGVyZSBpcyBubyBkZXN0aW5hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmssIGluIHRoaXMgY2FzZQovLwkJCXRoZSBhcHBsaWNhdGlvbiBzaG91bGQgdHJ5IEZQREZMaW5rX0dldEFjdGlvbi4KLy8KRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZMaW5rX0dldERlc3QoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9MSU5LIGxpbmspOwoKLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldEFjdGlvbgovLwkJCUdldCBhY3Rpb24gaW5mbyBvZiBhIGxpbmsuCi8vIFBhcmFtZXRlcnM6Ci8vCQkJbGluawkJLQlIYW5kbGUgdG8gdGhlIGxpbmsuCi8vIFJldHVybiB2YWx1ZToKLy8JCQlIYW5kbGUgdG8gdGhlIGFjdGlvbi4gTlVMTCBpZiB0aGVyZSBpcyBubyBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLgovLwpETExFWFBPUlQgRlBERl9BQ1RJT04gU1REQ0FMTCBGUERGTGlua19HZXRBY3Rpb24oRlBERl9MSU5LIGxpbmspOwoKLy8gRnVuY3Rpb246IEZQREZMaW5rX0VudW1lcmF0ZQovLwkJCVRoaXMgZnVuY3Rpb24gd291bGQgZW51bWVyYXRlIGFsbCB0aGUgbGluayBhbm5vdGF0aW9ucyBpbiBhIHNpbmdsZSBQREYgcGFnZS4KLy8gUGFyYW1ldGVyczoKLy8JCQlwYWdlW2luXQkJCS0JSGFuZGxlIHRvIHRoZSBwYWdlLgovLwkJCXN0YXJ0UG9zW2luLG91dF0JLQlUaGUgc3RhcnQgcG9zaXRpb24gdG8gZW51bWVyYXRlIHRoZSBsaW5rIGFubm90YXRpb25zLCB3aGljaCBzaG91bGQgYmUgc3BlY2lmaWVkIHRvIHN0YXJ0IGZyb20gCi8vCQkJCQkJCQktCTAgZm9yIHRoZSBmaXJzdCBjYWxsLCBhbmQgd291bGQgcmVjZWl2ZSB0aGUgbmV4dCBwb3NpdGlvbiBmb3IgZW51bWVyYXRpbmcgdG8gc3RhcnQgZnJvbS4KLy8JCQlsaW5rQW5ub3Rbb3V0XQkJLQlSZWNlaXZlIHRoZSBsaW5rIGhhbmRsZS4KLy8gUmV0dXJuIHZhbHVlOgovLwkJCVRSVUUgaWYgc3VjY2NlZWQsIGVsc2UgRmFsc2U7Ci8vCkRMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19FbnVtZXJhdGUoRlBERl9QQUdFIHBhZ2UsIGludCogc3RhcnRQb3MsIEZQREZfTElOSyogbGlua0Fubm90KTsKCi8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRBbm5vdFJlY3QKLy8JCQlHZXQgdGhlIGFubm90YXRpb24gcmVjdGFuZ2xlLiAoU3BlY2lmaWVkIGJ5IHRoZSChsFJlY3ShsSBlbnRyeSBvZiBhbm5vdGF0aW9uIGRpY3Rpb25hcnkpLgovLyBQYXJhbWV0ZXJzOgovLwkJCWxpbmtBbm5vdFtpbl0JCS0JSGFuZGxlIHRvIHRoZSBsaW5rIGFubm90YXRpb24uCi8vCQkJcmVjdFtvdXRdCQkJLQlUaGUgYW5ub3RhdGlvbiByZWN0LgovLyBSZXR1cm4gdmFsdWU6Ci8vCQkJVFJVRSBpZiBzdWNjY2VlZCwgZWxzZSBGYWxzZTsKLy8KRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldEFubm90UmVjdChGUERGX0xJTksgbGlua0Fubm90LCBGU19SRUNURiogcmVjdCk7CgovLyBGdW5jdGlvbjogRlBERkxpbmtfQ291bnRRdWFkUG9pbnRzCi8vCQkJR2V0IHRoZSBjb3VudCBvZiBxdWFkcmlsYXRlcmFsIHBvaW50cyB0byB0aGUgbGluayBhbm5vdGF0aW9uLgovLyBQYXJhbWV0ZXJzOgovLwkJCWxpbmtBbm5vdFtpbl0JCS0JSGFuZGxlIHRvIHRoZSBsaW5rIGFubm90YXRpb24uCi8vIFJldHVybiB2YWx1ZToKLy8JCQlUaGUgY291bnQgb2YgcXVhZHJpbGF0ZXJhbCBwb2ludHMuCi8vCkRMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGTGlua19Db3VudFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCk7CgovKiBfRlNfREVGX1NUUlVDVFVSRV9RVUFEUE9JTlRTRl8gKi8KI2lmbmRlZiBfRlNfREVGX1NUUlVDVFVSRV9RVUFEUE9JTlRTRl8KI2RlZmluZSBfRlNfREVGX1NUUlVDVFVSRV9RVUFEUE9JTlRTRl8KdHlwZWRlZiBzdHJ1Y3QgX0ZTX1FVQURQT0lOVFNGCnsKCUZTX0ZMT0FUICB4MTsKCUZTX0ZMT0FUICB5MTsKCUZTX0ZMT0FUICB4MjsKCUZTX0ZMT0FUICB5MjsKCUZTX0ZMT0FUICB4MzsKCUZTX0ZMT0FUICB5MzsKCUZTX0ZMT0FUICB4NDsKCUZTX0ZMT0FUICB5NDsKfSBGU19RVUFEUE9JTlRTRjsKI2VuZGlmIC8qIF9GU19ERUZfU1RSVUNUVVJFX1FVQURQT0lOVFNGXyAqLwoKLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldFF1YWRQb2ludHMKLy8JCQlHZXQgdGhlIHF1YWRyaWxhdGVyYWwgcG9pbnRzIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBsaW5rIGFubm90YXRpb24uCi8vIFBhcmFtZXRlcnM6Ci8vCQkJbGlua0Fubm90W2luXQkJLQlIYW5kbGUgdG8gdGhlIGxpbmsgYW5ub3RhdGlvbi4KLy8JCQlxdWFkSW5kZXhbaW5dCQktCVRoZSBzcGVjaWZpZWQgcXVhZCBwb2ludHMgaW5kZXguCi8vCQkJcXVhZFBvaW50c1tvdXRdCQktCVJlY2VpdmUgdGhlIHF1YWRyaWxhdGVyYWwgcG9pbnRzLgovLyBSZXR1cm4gdmFsdWU6Ci8vCQkJVHJ1ZSBpZiBzdWNjZWVkLCBlbHNlIEZhbHNlLgovLwpETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfR2V0UXVhZFBvaW50cyhGUERGX0xJTksgbGlua0Fubm90LCBpbnQgcXVhZEluZGV4LCBGU19RVUFEUE9JTlRTRiogcXVhZFBvaW50cyk7CgovLyBGdW5jdGlvbjogRlBERl9HZXRNZXRhVGV4dAovLwkJCUdldCBhIHRleHQgZnJvbSBtZXRhIGRhdGEgb2YgdGhlIGRvY3VtZW50LiBSZXN1bHQgaXMgZW5jb2RlZCBpbiBVVEYtMTZMRS4KLy8gUGFyYW1ldGVyczoKLy8JCQlkb2MJCQktCUhhbmRsZSB0byBhIGRvY3VtZW50Ci8vCQkJdGFnCQkJLQlUaGUgdGFnIGZvciB0aGUgbWV0YSBkYXRhLiBDdXJyZW50bHksIEl0IGNhbiBiZSAiVGl0bGUiLCAiQXV0aG9yIiwgCi8vCQkJCQkJCSJTdWJqZWN0IiwgIktleXdvcmRzIiwgIkNyZWF0b3IiLCAiUHJvZHVjZXIiLCAiQ3JlYXRpb25EYXRlIiwgb3IgIk1vZERhdGUiLgovLwkJCQkJCQlGb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhlc2UgdGFncyBhbmQgdGhlaXIgcmVzcGVjdGl2ZSB2YWx1ZXMsCi8vCQkJCQkJCXBsZWFzZSByZWZlciB0byBQREYgUmVmZXJlbmNlIDEuNiwgc2VjdGlvbiAxMC4yLjEsICJEb2N1bWVudCBJbmZvcm1hdGlvbiBEaWN0aW9uYXJ5Ii4KLy8JCQlidWZmZXIJCS0JQSBidWZmZXIgZm9yIG91dHB1dCB0aGUgdGl0bGUuIENhbiBiZSBOVUxMLgovLwkJCWJ1ZmxlbgkJLQlUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4gQ2FuIGJlIDAuCi8vIFJldHVybiB2YWx1ZToKLy8JCQlOdW1iZXIgb2YgYnl0ZXMgdGhlIHRpdGxlIGNvbnN1bWVzLCBpbmNsdWRpbmcgdHJhaWxpbmcgemVyb3MuCi8vIENvbW1lbnRzOgovLwkJCU5vIG1hdHRlciBvbiB3aGF0IHBsYXRmb3JtLCB0aGUgdGl0bGUgaXMgYWx3YXlzIG91dHB1dCBpbiBVVEYtMTZMRSBlbmNvZGluZywgd2hpY2ggbWVhbnMgdGhlIGJ1ZmZlciAKLy8JCQljYW4gYmUgcmVnYXJkZWQgYXMgYW4gYXJyYXkgb2YgV09SRCAob24gSW50ZWwgYW5kIGNvbXBhdGlibGUgQ1BVcyksIGVhY2ggV09SRCByZXByZXNlbnQgdGhlIFVuaWNvZGUgb2YgCi8vCQkJYSBjaGFyYWN0ZXIgKHNvbWUgc3BlY2lhbCBVbmljb2RlIG1heSB0YWtlIDIgV09SRHMpLiBUaGUgc3RyaW5nIGlzIGZvbGxvd2VkIGJ5IHR3byBieXRlcyBvZiB6ZXJvIAovLwkJCWluZGljYXRpbmcgZW5kIG9mIHRoZSBzdHJpbmcuCi8vCi8vCQkJVGhlIHJldHVybiB2YWx1ZSBhbHdheXMgaW5kaWNhdGVkIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIGJ1ZmZlciwgZXZlbiB3aGVuIHRoZXJlIGlzCi8vCQkJbm8gYnVmZmVyIHNwZWNpZmllZCwgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIHdpbGwgbm90Ci8vCQkJYmUgbW9kaWZpZWQuCi8vCkRMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERl9HZXRNZXRhVGV4dChGUERGX0RPQ1VNRU5UIGRvYywgRlBERl9CWVRFU1RSSU5HIHRhZywKCQkJCQkJCQkJCQkJIHZvaWQqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZsZW4pOwoKCiNpZmRlZiBfX2NwbHVzcGx1cwp9OwojZW5kaWYKCiNlbmRpZgkvLyBfRlBERkRPQ19IXwo=