Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCg0KI2lmbmRlZiBfRlBERkRPQ19IXw0KI2RlZmluZSBfRlBERkRPQ19IXw0KDQojaW5jbHVkZSAiZnBkZnZpZXcuaCINCg0KLy8gRXhwb3J0ZWQgRnVuY3Rpb25zDQojaWZkZWYgX19jcGx1c3BsdXMNCmV4dGVybiAiQyIgew0KI2VuZGlmDQoNCi8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfRmluZA0KLy8JCQlGaW5kIGEgYm9va21hcmsgaW4gdGhlIGRvY3VtZW50LCB1c2luZyB0aGUgYm9va21hcmsgdGl0bGUuDQovLyBQYXJhbWV0ZXJzOiANCi8vCQkJZG9jdW1lbnQJLQlIYW5kbGUgdG8gdGhlIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBvciBGUERGX0xvYWRNZW1Eb2N1bWVudC4NCi8vCQkJdGl0bGUJCS0JVGhlIFVURi0xNkxFIGVuY29kZWQgVW5pY29kZSBzdHJpbmcgZm9yIHRoZSBib29rbWFyayB0aXRsZSB0byBiZSBzZWFyY2hlZC4gQ2FuJ3QgYmUgTlVMTC4NCi8vIFJldHVybiB2YWx1ZToNCi8vCQkJSGFuZGxlIHRvIHRoZSBmb3VuZCBib29rbWFyayBpdGVtLiBOVUxMIGlmIHRoZSB0aXRsZSBjYW4ndCBiZSBmb3VuZC4NCi8vIENvbW1lbnRzOg0KLy8JCQlJdCBhbHdheXMgcmV0dXJucyB0aGUgZmlyc3QgZm91bmQgYm9va21hcmsgaWYgbW9yZSB0aGFuIG9uZSBib29rbWFya3MgaGF2ZSB0aGUgc2FtZSB0aXRsZS4NCi8vDQpETExFWFBPUlQgRlBERl9CT09LTUFSSyBTVERDQUxMIEZQREZCb29rbWFya19GaW5kKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lERVNUUklORyB0aXRsZSk7DQoNCi8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfR2V0RGVzdA0KLy8JCQlHZXQgdGhlIGRlc3RpbmF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIGJvb2ttYXJrIGl0ZW0uDQovLyBQYXJhbWV0ZXJzOg0KLy8JCQlkb2N1bWVudAktCUhhbmRsZSB0byB0aGUgZG9jdW1lbnQuDQovLwkJCWJvb2ttYXJrCS0JSGFuZGxlIHRvIHRoZSBib29rbWFyay4NCi8vIFJldHVybiB2YWx1ZToNCi8vCQkJSGFuZGxlIHRvIHRoZSBkZXN0aW5hdGlvbiBkYXRhLiBOVUxMIGlmIG5vIGRlc3RpbmF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJvb2ttYXJrLg0KLy8NCkRMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0JPT0tNQVJLIGJvb2ttYXJrKTsNCg0KLy8gRnVuY3Rpb246IEZQREZCb29rbWFya19HZXRBY3Rpb24NCi8vCQkJR2V0IHRoZSBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIGEgYm9va21hcmsgaXRlbS4NCi8vIFBhcmFtZXRlcnM6DQovLwkJCWJvb2ttYXJrCS0JSGFuZGxlIHRvIHRoZSBib29rbWFyay4NCi8vIFJldHVybiB2YWx1ZToNCi8vCQkJSGFuZGxlIHRvIHRoZSBhY3Rpb24gZGF0YS4gTlVMTCBpZiBubyBhY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYm9va21hcmsuIEluIHRoaXMgY2FzZSwgdGhlIA0KLy8JCQlhcHBsaWNhdGlvbiBzaG91bGQgdHJ5IEZQREZCb29rbWFya19HZXREZXN0Lg0KLy8NCkRMTEVYUE9SVCBGUERGX0FDVElPTiBTVERDQUxMIEZQREZCb29rbWFya19HZXRBY3Rpb24oRlBERl9CT09LTUFSSyBib29rbWFyayk7DQoNCiNkZWZpbmUgUERGQUNUSU9OX1VOU1VQUE9SVEVECQkwCQkvLyBVbnN1cHBvcnRlZCBhY3Rpb24gdHlwZS4NCiNkZWZpbmUgUERGQUNUSU9OX0dPVE8JCQkJMQkJLy8gR28gdG8gYSBkZXN0aW5hdGlvbiB3aXRoaW4gY3VycmVudCBkb2N1bWVudC4NCiNkZWZpbmUgUERGQUNUSU9OX1JFTU9URUdPVE8JCTIJCS8vIEdvIHRvIGEgZGVzdGluYXRpb24gd2l0aGluIGFub3RoZXIgZG9jdW1lbnQuDQojZGVmaW5lIFBERkFDVElPTl9VUkkJCQkJMwkJLy8gVW5pdmVyc2FsIFJlc291cmNlIElkZW50aWZpZXIsIGluY2x1ZGluZyB3ZWIgcGFnZXMgYW5kIA0KCQkJCQkJCQkJCQkvLyBvdGhlciBJbnRlcm5ldCBiYXNlZCByZXNvdXJjZXMuDQojZGVmaW5lIFBERkFDVElPTl9MQVVOQ0gJCQk0CQkvLyBMYXVuY2ggYW4gYXBwbGljYXRpb24gb3Igb3BlbiBhIGZpbGUuDQoNCi8vIEZ1bmN0aW9uOiBGUERGQWN0aW9uX0dldFR5cGUNCi8vCQkJR2V0IHR5cGUgb2YgYW4gYWN0aW9uLg0KLy8gUGFyYW1ldGVyczoNCi8vCQkJYWN0aW9uCQktCUhhbmRsZSB0byB0aGUgYWN0aW9uLg0KLy8gUmV0dXJuIHZhbHVlOg0KLy8JCQlBIHR5cGUgbnVtYmVyIGFzIGRlZmluZWQgYWJvdmUuDQovLw0KRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGQWN0aW9uX0dldFR5cGUoRlBERl9BQ1RJT04gYWN0aW9uKTsNCg0KLy8gRnVuY3Rpb246IEZQREZBY3Rpb25fR2V0RGVzdA0KLy8JCQlHZXQgZGVzdGluYXRpb24gb2YgYW4gYWN0aW9uLg0KLy8gUGFyYW1ldGVyczoNCi8vCQkJZG9jdW1lbnQJLQlIYW5kbGUgdG8gdGhlIGRvY3VtZW50Lg0KLy8JCQlhY3Rpb24JCS0JSGFuZGxlIHRvIHRoZSBhY3Rpb24uIEl0IG11c3QgYmUgYSBHT1RPIG9yIFJFTU9URUdPVE8gYWN0aW9uLg0KLy8gUmV0dXJuIHZhbHVlOg0KLy8JCQlIYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGRhdGEuDQovLyBDb21tZW50czoNCi8vCQkJSW4gY2FzZSBvZiByZW1vdGUgZ290byBhY3Rpb24sIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZmlyc3QgdXNlIEZQREZBY3Rpb25fR2V0RmlsZVBhdGggdG8NCi8vCQkJZ2V0IGZpbGUgcGF0aCwgdGhlbiBsb2FkIHRoYXQgcGFydGljdWxhciBkb2N1bWVudCwgYW5kIHVzZSBpdHMgZG9jdW1lbnQgaGFuZGxlIHRvIGNhbGwgdGhpcw0KLy8JCQlmdW5jdGlvbi4NCi8vDQpETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkFjdGlvbl9HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQUNUSU9OIGFjdGlvbik7DQoNCi8vIEZ1bmN0aW9uOiBGUERGQWN0aW9uX0dldFVSSVBhdGgNCi8vCQkJR2V0IFVSSSBwYXRoIG9mIGEgVVJJIGFjdGlvbi4NCi8vIFBhcmFtZXRlcnM6DQovLwkJCWRvY3VtZW50CS0JSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4NCi8vCQkJYWN0aW9uCQktCUhhbmRsZSB0byB0aGUgYWN0aW9uLiBNdXN0IGJlIGEgVVJJIGFjdGlvbi4NCi8vCQkJYnVmZmVyCQktCUEgYnVmZmVyIGZvciBvdXRwdXQgdGhlIHBhdGggc3RyaW5nLiBDYW4gYmUgTlVMTC4NCi8vCQkJYnVmbGVuCQktCVRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLiBDYW4gYmUgMC4NCi8vIFJldHVybiB2YWx1ZToNCi8vCQkJTnVtYmVyIG9mIGJ5dGVzIHRoZSBVUkkgcGF0aCBjb25zdW1lcywgaW5jbHVkaW5nIHRyYWlsaW5nIHplcm9zLg0KLy8gQ29tbWVudHM6DQovLwkJCVRoZSBVUkkgcGF0aCBpcyBhbHdheXMgZW5jb2RlZCBpbiA3LWJpdCBBU0NJSS4NCi8vIA0KLy8JCQlUaGUgcmV0dXJuIHZhbHVlIGFsd2F5cyBpbmRpY2F0ZWQgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgYnVmZmVyLCBldmVuIHdoZW4gdGhlcmUgaXMNCi8vCQkJbm8gYnVmZmVyIHNwZWNpZmllZCwgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIHdpbGwgbm90DQovLwkJCWJlIG1vZGlmaWVkLg0KLy8NCkRMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkFjdGlvbl9HZXRVUklQYXRoKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQUNUSU9OIGFjdGlvbiwgDQoJCQkJCQkJCQkJCQkJICB2b2lkKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsNCg0KLy8gRnVuY3Rpb246IEZQREZEZXN0X0dldFBhZ2VJbmRleA0KLy8JCQlHZXQgcGFnZSBpbmRleCBvZiBhIGRlc3RpbmF0aW9uLg0KLy8gUGFyYW1ldGVyczoNCi8vCQkJZG9jdW1lbnQJLQlIYW5kbGUgdG8gdGhlIGRvY3VtZW50Lg0KLy8JCQlkZXN0CQktCUhhbmRsZSB0byB0aGUgZGVzdGluYXRpb24uDQovLyBSZXR1cm4gdmFsdWU6DQovLwkJCVRoZSBwYWdlIGluZGV4LiBTdGFydGluZyBmcm9tIDAgZm9yIHRoZSBmaXJzdCBwYWdlLg0KLy8NCkRMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkRlc3RfR2V0UGFnZUluZGV4KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfREVTVCBkZXN0KTsNCg0KLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldExpbmtBdFBvaW50DQovLwkJCUZpbmQgYSBsaW5rIGF0IHNwZWNpZmllZCBwb2ludCBvbiBhIGRvY3VtZW50IHBhZ2UuDQovLyBQYXJhbWV0ZXJzOg0KLy8JCQlwYWdlCQktCUhhbmRsZSB0byB0aGUgZG9jdW1lbnQgcGFnZS4NCi8vCQkJeAkJCS0JVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQsIHNwZWNpZmllZCBpbiBwYWdlIGNvb3JkaW5hdGUgc3lzdGVtLg0KLy8JCQl5CQkJLQlUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCwgc3BlY2lmaWVkIGluIHBhZ2UgY29vcmRpbmF0ZSBzeXN0ZW0uDQovLyBSZXR1cm4gdmFsdWU6DQovLwkJCUhhbmRsZSB0byB0aGUgbGluay4gTlVMTCBpZiBubyBsaW5rIGZvdW5kIGF0IHRoYXQgcG9pbnQuDQovLyBDb21tZW50czoNCi8vCQkJVGhlIHBvaW50IGNvb3JkaW5hdGVzIGFyZSBzcGVjaWZpZWQgaW4gcGFnZSBjb29yZGluYXRlIHN5c3RlbS4gWW91IGNhbiBjb252ZXJ0IGNvb3JkaW5hdGVzIA0KLy8JCQlmcm9tIHNjcmVlbiBzeXN0ZW0gdG8gcGFnZSBzeXN0ZW0gdXNpbmcgRlBERl9EZXZpY2VUb1BhZ2UgZnVuY3Rpb25zLg0KLy8NCkRMTEVYUE9SVCBGUERGX0xJTksgU1REQ0FMTCBGUERGTGlua19HZXRMaW5rQXRQb2ludChGUERGX1BBR0UgcGFnZSwgZG91YmxlIHgsIGRvdWJsZSB5KTsNCg0KLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldERlc3QNCi8vCQkJR2V0IGRlc3RpbmF0aW9uIGluZm8gb2YgYSBsaW5rLg0KLy8gUGFyYW1ldGVyczoNCi8vCQkJZG9jdW1lbnQJLQlIYW5kbGUgdG8gdGhlIGRvY3VtZW50Lg0KLy8JCQlsaW5rCQktCUhhbmRsZSB0byB0aGUgbGluay4gUmV0dXJuZWQgYnkgRlBERkxpbmtfR2V0TGlua0F0UG9pbnQuDQovLyBSZXR1cm4gdmFsdWU6DQovLwkJCUhhbmRsZSB0byB0aGUgZGVzdGluYXRpb24uIE5VTEwgaWYgdGhlcmUgaXMgbm8gZGVzdGluYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBpbiB0aGlzIGNhc2UNCi8vCQkJdGhlIGFwcGxpY2F0aW9uIHNob3VsZCB0cnkgRlBERkxpbmtfR2V0QWN0aW9uLg0KLy8NCkRMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGTGlua19HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfTElOSyBsaW5rKTsNCg0KLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldEFjdGlvbg0KLy8JCQlHZXQgYWN0aW9uIGluZm8gb2YgYSBsaW5rLg0KLy8gUGFyYW1ldGVyczoNCi8vCQkJbGluawkJLQlIYW5kbGUgdG8gdGhlIGxpbmsuDQovLyBSZXR1cm4gdmFsdWU6DQovLwkJCUhhbmRsZSB0byB0aGUgYWN0aW9uLiBOVUxMIGlmIHRoZXJlIGlzIG5vIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmsuDQovLw0KRExMRVhQT1JUIEZQREZfQUNUSU9OIFNURENBTEwgRlBERkxpbmtfR2V0QWN0aW9uKEZQREZfTElOSyBsaW5rKTsNCg0KLy8gRnVuY3Rpb246IEZQREZMaW5rX0VudW1lcmF0ZQ0KLy8JCQlUaGlzIGZ1bmN0aW9uIHdvdWxkIGVudW1lcmF0ZSBhbGwgdGhlIGxpbmsgYW5ub3RhdGlvbnMgaW4gYSBzaW5nbGUgUERGIHBhZ2UuDQovLyBQYXJhbWV0ZXJzOg0KLy8JCQlwYWdlW2luXQkJCS0JSGFuZGxlIHRvIHRoZSBwYWdlLg0KLy8JCQlzdGFydFBvc1tpbixvdXRdCS0JVGhlIHN0YXJ0IHBvc2l0aW9uIHRvIGVudW1lcmF0ZSB0aGUgbGluayBhbm5vdGF0aW9ucywgd2hpY2ggc2hvdWxkIGJlIHNwZWNpZmllZCB0byBzdGFydCBmcm9tIA0KLy8JCQkJCQkJCS0JMCBmb3IgdGhlIGZpcnN0IGNhbGwsIGFuZCB3b3VsZCByZWNlaXZlIHRoZSBuZXh0IHBvc2l0aW9uIGZvciBlbnVtZXJhdGluZyB0byBzdGFydCBmcm9tLg0KLy8JCQlsaW5rQW5ub3Rbb3V0XQkJLQlSZWNlaXZlIHRoZSBsaW5rIGhhbmRsZS4NCi8vIFJldHVybiB2YWx1ZToNCi8vCQkJVFJVRSBpZiBzdWNjY2VlZCwgZWxzZSBGYWxzZTsNCi8vDQpETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfRW51bWVyYXRlKEZQREZfUEFHRSBwYWdlLCBpbnQqIHN0YXJ0UG9zLCBGUERGX0xJTksqIGxpbmtBbm5vdCk7DQoNCi8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRBbm5vdFJlY3QNCi8vCQkJR2V0IHRoZSBhbm5vdGF0aW9uIHJlY3RhbmdsZS4gKFNwZWNpZmllZCBieSB0aGUgobBSZWN0obEgZW50cnkgb2YgYW5ub3RhdGlvbiBkaWN0aW9uYXJ5KS4NCi8vIFBhcmFtZXRlcnM6DQovLwkJCWxpbmtBbm5vdFtpbl0JCS0JSGFuZGxlIHRvIHRoZSBsaW5rIGFubm90YXRpb24uDQovLwkJCXJlY3Rbb3V0XQkJCS0JVGhlIGFubm90YXRpb24gcmVjdC4NCi8vIFJldHVybiB2YWx1ZToNCi8vCQkJVFJVRSBpZiBzdWNjY2VlZCwgZWxzZSBGYWxzZTsNCi8vDQpETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfR2V0QW5ub3RSZWN0KEZQREZfTElOSyBsaW5rQW5ub3QsIEZTX1JFQ1RGKiByZWN0KTsNCg0KLy8gRnVuY3Rpb246IEZQREZMaW5rX0NvdW50UXVhZFBvaW50cw0KLy8JCQlHZXQgdGhlIGNvdW50IG9mIHF1YWRyaWxhdGVyYWwgcG9pbnRzIHRvIHRoZSBsaW5rIGFubm90YXRpb24uDQovLyBQYXJhbWV0ZXJzOg0KLy8JCQlsaW5rQW5ub3RbaW5dCQktCUhhbmRsZSB0byB0aGUgbGluayBhbm5vdGF0aW9uLg0KLy8gUmV0dXJuIHZhbHVlOg0KLy8JCQlUaGUgY291bnQgb2YgcXVhZHJpbGF0ZXJhbCBwb2ludHMuDQovLw0KRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZMaW5rX0NvdW50UXVhZFBvaW50cyhGUERGX0xJTksgbGlua0Fubm90KTsNCg0KLyogX0ZTX0RFRl9TVFJVQ1RVUkVfUVVBRFBPSU5UU0ZfICovDQojaWZuZGVmIF9GU19ERUZfU1RSVUNUVVJFX1FVQURQT0lOVFNGXw0KI2RlZmluZSBfRlNfREVGX1NUUlVDVFVSRV9RVUFEUE9JTlRTRl8NCnR5cGVkZWYgc3RydWN0IF9GU19RVUFEUE9JTlRTRg0Kew0KCUZTX0ZMT0FUICB4MTsNCglGU19GTE9BVCAgeTE7DQoJRlNfRkxPQVQgIHgyOw0KCUZTX0ZMT0FUICB5MjsNCglGU19GTE9BVCAgeDM7DQoJRlNfRkxPQVQgIHkzOw0KCUZTX0ZMT0FUICB4NDsNCglGU19GTE9BVCAgeTQ7DQp9IEZTX1FVQURQT0lOVFNGOw0KI2VuZGlmIC8qIF9GU19ERUZfU1RSVUNUVVJFX1FVQURQT0lOVFNGXyAqLw0KDQovLyBGdW5jdGlvbjogRlBERkxpbmtfR2V0UXVhZFBvaW50cw0KLy8JCQlHZXQgdGhlIHF1YWRyaWxhdGVyYWwgcG9pbnRzIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBsaW5rIGFubm90YXRpb24uDQovLyBQYXJhbWV0ZXJzOg0KLy8JCQlsaW5rQW5ub3RbaW5dCQktCUhhbmRsZSB0byB0aGUgbGluayBhbm5vdGF0aW9uLg0KLy8JCQlxdWFkSW5kZXhbaW5dCQktCVRoZSBzcGVjaWZpZWQgcXVhZCBwb2ludHMgaW5kZXguDQovLwkJCXF1YWRQb2ludHNbb3V0XQkJLQlSZWNlaXZlIHRoZSBxdWFkcmlsYXRlcmFsIHBvaW50cy4NCi8vIFJldHVybiB2YWx1ZToNCi8vCQkJVHJ1ZSBpZiBzdWNjZWVkLCBlbHNlIEZhbHNlLg0KLy8NCkRMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19HZXRRdWFkUG9pbnRzKEZQREZfTElOSyBsaW5rQW5ub3QsIGludCBxdWFkSW5kZXgsIEZTX1FVQURQT0lOVFNGKiBxdWFkUG9pbnRzKTsNCg0KLy8gRnVuY3Rpb246IEZQREZfR2V0TWV0YVRleHQNCi8vCQkJR2V0IGEgdGV4dCBmcm9tIG1ldGEgZGF0YSBvZiB0aGUgZG9jdW1lbnQuIFJlc3VsdCBpcyBlbmNvZGVkIGluIFVURi0xNkxFLg0KLy8gUGFyYW1ldGVyczoNCi8vCQkJZG9jCQkJLQlIYW5kbGUgdG8gYSBkb2N1bWVudA0KLy8JCQl0YWcJCQktCVRoZSB0YWcgZm9yIHRoZSBtZXRhIGRhdGEuIEN1cnJlbnRseSwgSXQgY2FuIGJlICJUaXRsZSIsICJBdXRob3IiLCANCi8vCQkJCQkJCSJTdWJqZWN0IiwgIktleXdvcmRzIiwgIkNyZWF0b3IiLCAiUHJvZHVjZXIiLCAiQ3JlYXRpb25EYXRlIiwgb3IgIk1vZERhdGUiLg0KLy8JCQkJCQkJRm9yIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoZXNlIHRhZ3MgYW5kIHRoZWlyIHJlc3BlY3RpdmUgdmFsdWVzLA0KLy8JCQkJCQkJcGxlYXNlIHJlZmVyIHRvIFBERiBSZWZlcmVuY2UgMS42LCBzZWN0aW9uIDEwLjIuMSwgIkRvY3VtZW50IEluZm9ybWF0aW9uIERpY3Rpb25hcnkiLg0KLy8JCQlidWZmZXIJCS0JQSBidWZmZXIgZm9yIG91dHB1dCB0aGUgdGl0bGUuIENhbiBiZSBOVUxMLg0KLy8JCQlidWZsZW4JCS0JVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMuIENhbiBiZSAwLg0KLy8gUmV0dXJuIHZhbHVlOg0KLy8JCQlOdW1iZXIgb2YgYnl0ZXMgdGhlIHRpdGxlIGNvbnN1bWVzLCBpbmNsdWRpbmcgdHJhaWxpbmcgemVyb3MuDQovLyBDb21tZW50czoNCi8vCQkJTm8gbWF0dGVyIG9uIHdoYXQgcGxhdGZvcm0sIHRoZSB0aXRsZSBpcyBhbHdheXMgb3V0cHV0IGluIFVURi0xNkxFIGVuY29kaW5nLCB3aGljaCBtZWFucyB0aGUgYnVmZmVyIA0KLy8JCQljYW4gYmUgcmVnYXJkZWQgYXMgYW4gYXJyYXkgb2YgV09SRCAob24gSW50ZWwgYW5kIGNvbXBhdGlibGUgQ1BVcyksIGVhY2ggV09SRCByZXByZXNlbnQgdGhlIFVuaWNvZGUgb2YgDQovLwkJCWEgY2hhcmFjdGVyIChzb21lIHNwZWNpYWwgVW5pY29kZSBtYXkgdGFrZSAyIFdPUkRzKS4gVGhlIHN0cmluZyBpcyBmb2xsb3dlZCBieSB0d28gYnl0ZXMgb2YgemVybyANCi8vCQkJaW5kaWNhdGluZyBlbmQgb2YgdGhlIHN0cmluZy4NCi8vDQovLwkJCVRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGluZGljYXRlZCBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBidWZmZXIsIGV2ZW4gd2hlbiB0aGVyZSBpcw0KLy8JCQlubyBidWZmZXIgc3BlY2lmaWVkLCBvciB0aGUgYnVmZmVyIHNpemUgaXMgbGVzcyB0aGVuIHJlcXVpcmVkLiBJbiB0aGlzIGNhc2UsIHRoZSBidWZmZXIgd2lsbCBub3QNCi8vCQkJYmUgbW9kaWZpZWQuDQovLw0KRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGX0dldE1ldGFUZXh0KEZQREZfRE9DVU1FTlQgZG9jLCBGUERGX0JZVEVTVFJJTkcgdGFnLA0KCQkJCQkJCQkJCQkJIHZvaWQqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZsZW4pOw0KDQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KfTsNCiNlbmRpZg0KDQojZW5kaWYJLy8gX0ZQREZET0NfSF8NCg==