ZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzQ5LzQ5OTViZDI2OThkNDNhOGRjZDJmMDQxYTM5NTczZmQ4ZDg1NjU2Njguc3ZuLWJhc2UgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS80OS80OTk1YmQyNjk4ZDQzYThkY2QyZjA0MWEzOTU3M2ZkOGQ4NTY1NjY4LnN2bi1iYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOWZjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS80OS80OTk1YmQyNjk4ZDQzYThkY2QyZjA0MWEzOTU3M2ZkOGQ4NTY1NjY4LnN2bi1iYXNlCkBAIC0wLDAgKzEsNTQ3IEBACisgLyoqDQorICogQGZpbGUgYmRJTUFEcGouaA0KKyAqIEBicmllZiBiZFNvdW5kIElNcHJvdmVkIEF1ZGlvIERldmljZSBmb3IgUEpTSVAuDQorICovDQorIA0KKy8qKg0KKyAqIEBkZWZncm91cCBiZF9JTUFEIGJkSU1BRHBqIGJkU291bmQgSU1wcm92ZWQgQXVkaW8gRGV2aWNlIGZvciBQSlNJUC4NCisgKiBAaW5ncm91cCBhdWRpb19kZXZpY2VfYXBpDQorICogDQorICogPGI+YmRTb3VuZCBJTXByb3ZlZCBBdWRpbyBEZXZpY2U8L2I+IGlzIGEgbXVsdGlwbGF0Zm9ybSBhdWRpbyBpbnRlcmZhY2UNCisgKiBjcmVhdGVkIHRvIGludGVncmF0ZSBpbiA8Yj5QSlNJUDwvYj4gbGlicmFyeSB3aXRoIG5vIGVmZm9ydC4NCisgKiBcbiBQb3J0aW5nIDxiPmJkSU1BRHBqPC9iPiBhY3Jvc3MgdGhlIG1haW4gb3BlcmF0aW5nIHN5c3RlbXMgaXMNCisgKiBzdHJhaWdodGZvcndhcmQsIHdpdGhvdXQgdGhlIG5lZWQgb2YgY2hhbmdlIGEgc2luZ2xlIGxpbmUgb2YgY29kZS4NCisgKg0KKyAqICAgIC0gPGI+RmVhdHVyZXM8L2I+DQorICogICAgICAgLSBFY2hvIGNhbmNlbGxhdGlvbiAoRnVsbCBEdXBsZXgpDQorICogICAgICAgLSBOb2lzZSByZWR1Y3Rpb24NCisgKiAgICAgICAtIEF1dG9tYXRpYyBHYWluIENvbnRyb2wNCisgKiAgICAgICAtIEF1ZGlvIEVuaGFuY2VtZW50DQorICoNCisgKiAgICAtIDxiPlN1cHBvcnRlZCBvcGVyYXRpbmcgc3lzdGVtczwvYj4NCisgKiAgICAgICAtIFdpbmRvd3MNCisgKiAgICAgICAtIEFuZHJvaWQNCisgKiAgICAgICAtIE1hY09TIFgNCisgKiAgICAgICAtIGlPUw0KKyAqICAgICAgIC0gTGludXggLyBBbHNhDQorICoNCisgKiAgICAtIDxiPlN1cHBvcnRlZCBwbGF0Zm9ybXM8L2I+DQorICogICAgICAgLSB4ODYNCisgKiAgICAgICAtIHg2NA0KKyAqICAgICAgIC0gQVJNIENvcnRleC1BOC9BOS9BMTUgd2l0aCBORU9ODQorICogDQorICogVmlzaXQgPGEgaHJlZj0iaHR0cDovd3d3LmJkc291bmQuY29tIiB0YXJnZXQ9Im5ldyI+YmRTb3VuZDwvYT4gZm9yIHVwZGF0ZWQNCisgKiBmZWF0dXJlcywgc3VwcG9ydGVkIG9wZXJhdGluZyBzeXN0ZW1zIGFuZCBwbGF0Zm9ybXMuDQorICogDQorICogPGI+VXNpbmcgUEpTSVAgd2l0aCBiZElNQUQgYXVkaW8gZGV2aWNlPC9iPg0KKyAqIA0KKyAqICAgIC0gPGI+SW50ZWdyYXRpb248L2I+DQorICogICAgXG4gVXNpbmcgPGI+YmRJTUFEPC9iPiB3aXRoaW4gPGI+UEpTSVA8L2I+IGlzIHNpbXBsZToNCisgKiAgICAgICAtIyBSZXF1ZXN0IGZvciBiZElNQURwaiBsaWJyYXJ5IHRvDQorICogICAgICAgPGEgaHJlZj0iaHR0cDovd3d3LmJkc291bmQuY29tIiB0YXJnZXQ9Im5ldyI+YmRTb3VuZDwvYT46DQorICogICAgICAgIGJkU291bmQgd2lsbCBwcm92aWRlIGluc3RydWN0aW9uIHRvIGludGVncmF0ZSB0aGUgbGlicmFyeSBkZXBlbmRpbmcgb24NCisgKiAgICAgICAgdGhlIHBsYXRmb3JtIC8gTy5TLiAvIHRvb2xjaGFpbjsNCisgKiAgICAgICAtIyBBZGQgdGhlIDxjb2RlPmJkaW1hZF9kZXYuYzwvY29kZT4gZmlsZSB0bw0KKyAqICAgICAgIDxjb2RlPnBqbWVkaWEvc3JjL3BqbWVkaWEtYXVkaW9kZXY8L2NvZGU+IGZvbGRlcjsNCisgKiAgICAgICAtIyBFbmFibGUgdGhlIGJkSU1BRCBhdWRpbyBkZXZpY2UgZGVmaW5pbmcgdGhlIHBlcmlmZXJhbCBpbiB0aGUNCisgKiAgICAgICA8Y29kZT5wai9jb25maWdfc2l0ZS5oPC9jb2RlPiBhbmQgZGlzYWJsaW5nIGFsbCBvdGhlciBkZXZpY2VzOg0KKyAqICAgICAgIDxwcmU+DQorICogICAgICAgI2RlZmluZSBQSk1FRElBX0FVRElPX0RFVl9IQVNfQkRJTUFEIDENCisgKiAgICAgICA8L3ByZT4NCisgKg0KKyAqICAgIC0gPGI+VXNhZ2U8L2I+DQorICogICAgXG4gVGhlcmUgYXJlIG9ubHkgYSBjb3VwbGUgb2YgdGhpbmdzIHRoZSBjdXN0b21lciBoYXZlIHRvIHBheSBhdHRlbnRpb24gb24NCisgKiAgICCnd2hlbiB1c2luZyBiZElNQUQgbGlicmFyeS4NCisgKg0KKyAqICAgICAgIC0gPGI+SW5pdGlhbGl6YXRpb248L2I+DQorICogICAgICAgXG4gU2luY2UgdGhlIGJkSU1BRCBsaWJyYXJ5IHByb3ZpZGUgaXRzZWxmIHRoZSBlY2hvIGNhbmNlbGxhdGlvbg0KKyAqICAgICAgIGFuZCB0aGUgbGF0ZW5jeSBtYW5hZ2VtZW50LCBpcyBuZWNlc3NhcnkgdG8gZGlzYWJsZSB0aGVzZSBmZWF0dXJlcw0KKyAqICAgICAgIGluIHRoZSBQSlNJUCBsaWJyYXJpeSBhcHBsaWNhdGlvbnMuDQorICogICAgICAgXG4gRm9yIGV4YW1wbGUgaW4gUEpTVUEgc2FtcGxlIGFwcGxpY2F0aW9uIHRoZXJlIGlzIHRoZSBuZWVkDQorICogICAgICAgdG8gcHJvdmlkZSB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOg0KKyAqICAgICAgIDxwcmU+DQorICogICAgICAgLS1lYy10YWlsPTANCisgKiAgICAgICAtLW5vLXZhZA0KKyAqICAgICAgIC0tY2FwdHVyZS1sYXQ9MA0KKyAqICAgICAgIC0tcGxheWJhY2stbGF0PTANCisgKiAgICAgICA8L3ByZT4NCisgKiANCisgKiAgICAgICAtIDxiPlN1cHBvcnRlZCBzZXQgY2FwYWJpbGl0eTwvYj4NCisgKiAgICAgICAgICAtIDxjb2RlPlBKTUVESUFfQVVEX0RFVl9DQVBfT1VUUFVUX1ZPTFVNRV9TRVRUSU5HPC9jb2RlPg0KKyAqICAgICAgICAgIFxuIFNldHRpbmcgc3BlYWtlciB2b2x1bWUuDQorICogICAgICAgICAgLSA8Y29kZT5QSk1FRElBX0FVRF9ERVZfQ0FQX0lOUFVUX1ZPTFVNRV9TRVRUSU5HPC9jb2RlPg0KKyAqICAgICAgICAgIFxuIFNldHRpbmcgbWljaHJvcGhvbmUgdm9sdW1lLg0KKyAqICAgICAgICAgIC0gPGNvZGU+UEpNRURJQV9BVURfREVWX0NBUF9FQzwvY29kZT4NCisgKiAgICAgICAgICBcbiBFbmFibGUvZGlzYWJsZSBlY2hvIGNhbmNlbGxhdGlvbi4NCisgKg0KKyAqIEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHZpc2l0DQorICogPGEgaHJlZj0iaHR0cDovd3d3LmJkc291bmQuY29tIiB0YXJnZXQ9Im5ldyI+d3d3LmJkc291bmQuY29tPC9hPg0KKyAqIG9yIHdyaXRlIHRvIGluZm9AYmRzb3VuZC5jb20NCisgKg0KKyAqIEBhdXRob3IgYmRTb3VuZA0KKyAqIEB2ZXJzaW9uICAgMS4wLjENCisgKiBAY29weXJpZ2h0IDIwMTIgYmRTb3VuZCBzcmwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorICoNCisgKi8NCisNCisvKiogICAgICAgIA0KKyAqIEBkZWZncm91cCBncm91cEZ1bmN0aW9uIEZ1bmN0aW9ucyAgICAgIA0KKyAqIEBpbmdyb3VwIGJkX0lNQUQgIA0KKyAqIA0KKyAqIEZ1bmN0aW9ucyBkZWZpbmVkIGluIGJkSU1BRC4NCisgKi8NCisNCisvKiogICAgICAgIA0KKyAqIEBkZWZncm91cCBncm91cENhbGxiYWNrIENhbGxiYWNrcyAgICAgIA0KKyAqIEBpbmdyb3VwIGJkX0lNQUQgICAgDQorICogDQorICogQ2FsbGJhY2tzIGRlZmluZWQgaW4gYmRJTUFELg0KKyAqLw0KKyANCisvKiogICAgICAgIA0KKyAqIEBkZWZncm91cCBncm91cFN0cnVjdEVudW0gU3RydWN0cyBhbmQgRW51bXMgICAgICAgDQorICogQGluZ3JvdXAgYmRfSU1BRCAgIA0KKyAqIA0KKyAqIFN0cnVjdCBhbmQgRW51bSBkZWZpbmVkIGluIGJkSU1BRC4NCisgKi8NCisNCisjaWZuZGVmIEJEX0lNQURfUEpfSF9fDQorI2RlZmluZSBCRF9JTUFEX1BKX0hfXw0KKyAgDQorLyoqDQorICogQGJyaWVmIE1hY3JvIGZvciBXaW5kb3dzIERMTCBTdXBwb3J0Lg0KKyAqLw0KKyANCisjaWZkZWYgX0JESU1BRFBKX0VYUE9SVERMTA0KKwkjaWZkZWYgV0lOMzINCisJCSNkZWZpbmUgQkRJTUFEUEpfQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQ0KKwkjZWxzZQ0KKwkJI2RlZmluZSBCRElNQURQSl9BUEkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkJDQorCSNlbmRpZg0KKyNlbHNlDQorCSNkZWZpbmUgQkRJTUFEUEpfQVBJDQorI2VuZGlmDQorDQorI2RlZmluZSBCRF9JTUFEX0NBUFRVUkVfREVWSUNFUyAgICAgIDENCisjZGVmaW5lIEJEX0lNQURfUExBWUJBQ0tfREVWSUNFUyAgICAgMA0KKyNkZWZpbmUgQkRfSU1BRF9ESUFHTk9TVElDX0VOQUJMRSAgICAxDQorI2RlZmluZSBCRF9JTUFEX0RJQUdOT1NUSUNfRElTQUJMRSAgIDANCisNCisjZGVmaW5lIEJEX0lNQURfQklUU19YX1NBTVBMRQkgICAgIDE2ICAgICAgICAgICAgICAgICAgLyoqPCBCaXRzIHBlciBzYW1wbGUgKi8NCisNCit0eXBlZGVmIHZvaWQqIGJkSU1BRHBqOw0KKw0KKy8qKg0KKyAqIEBhZGR0b2dyb3VwIGdyb3VwQ2FsbGJhY2sNCisgKiBAew0KKyAqLw0KKw0KKy8qKg0KKyAqIEBicmllZiBDYWxsYmFjayB1c2VkIHRvIGZpbGwgdGhlIHBsYXliYWNrIGJ1ZmZlciBvZiBiZElNQUQuDQorICogVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBiZElNQUQgZWFjaCB0aW1lIGFyZSByZXF1aXJlZCBzYW1wbGUgdG8gYmUgcGxheWVkLg0KKyAqIEBwYXJhbVtpbl0gKmJ1ZmZlciAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB3aXRoIHRoZSBhdWRpbw0KKyAqIAkJCQkgICAgICAgc2FtcGxlcyB0byBiZSBwbGF5ZWQoc2hvcnQgdHlwZSkuDQorICogQHBhcmFtW2luXSBuU2FtcGxlcyAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIHNhbXBsZXMgcmVxdWlyZWQuDQorICogQHBhcmFtW2luXSB1c2VyX2RhdGEgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgdXNlciBkYXRhIHN0cnVjdHVyZQ0KKyAqIAkJCQkgICAgICAgZGVmaW5lZCBpbiB0aGUgYmRJTUFEcGpfU2V0dGluZ190DQorICogCQkJCSAgICAgICBzdHJ1Y3R1cmUuDQorICogQHJldHVybiBub25lLg0KKyAqLw0KKw0KK3R5cGVkZWYgaW50ICgqIGNiX2ZpbGxQbGF5QmFja0JfdCkgKHZvaWQgKmJ1ZmZlciwgaW50IG5TYW1wbGVzLA0KKwkJCQkgICAgdm9pZCAqdXNlcl9kYXRhKTsNCisNCisvKioNCisgKiBAYnJpZWYgQ2FsbGJhY2sgdXNlZCB0byByZXRyaXZlIHRoZSBjYXB1dHJlIGJ1ZmZlciBvZiBiZElNQUQuIFRoZSBmdW5jdGlvbg0KKyAqIGlzIGNhbGxlZCBieSBiZElNQUQgZWFjaCB0aW1lIHByb2Nlc3NlZCBtaWMgc2FtcGxlcyBhcmUgYXZhaWxhYmxlLg0KKyAqIEBwYXJhbVtvdXRdICpidWZmZXIgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB3aXRoIHRoZSBhdWRpbw0KKyAqIAkJCQkgICAgICAgc2FtcGxlcyB0byBkb3dubG9hZChzaG9ydCB0eXBlKS4NCisgKiBAcGFyYW1baW5dIG5TYW1wbGVzICAgICAgICAgICAgICAgICBudW1iZXIgb2Ygc2FtcGxlcyBwcm9jZXNzZWQgdG8gZG93bmxvYWQuDQorICogQHBhcmFtW2luXSB1c2VyX2RhdGEgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgdXNlciBkYXRhIHN0cnVjdHVyZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgaW4gdGhlIE1haW5TZXQgc3RydWN0dXJlLg0KKyAqIEByZXR1cm4gbm9uZS4NCisgKi8NCisNCit0eXBlZGVmIHZvaWQgKCogY2JfZW1wdHlDYXB0dXJlQl90KSAodm9pZCAqYnVmZmVyLCBpbnQgblNhbXBsZXMsDQorCQkJCSAgICAgdm9pZCAqdXNlcl9kYXRhKTsNCisvKioNCisgKiBAfQ0KKyAqLw0KKw0KKy8qKg0KKyAqIEBhZGR0b2dyb3VwIGdyb3VwU3RydWN0RW51bQ0KKyAqIEB7DQorICovDQorIA0KKy8qKg0KKyAqIEBicmllZiBFcnJvciBzdGF0dXMgcmV0dXJuZWQgYnkgc29tZSBmdW5jdGlvbnMgaW4gdGhlIGxpYnJhcnkuDQorICovDQorDQordHlwZWRlZiBlbnVtIGJkSU1BRHBqX1N0YXR1c3sNCisgICAgLyoqPCBObyBlcnJvci4gKi8NCisgICAgQkRfUEpfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLA0KKyAgICAvKio8IFdhdGNoIGJkSU1BRHBqX1dhcm5pbmdzX3Qgc3RydWN0dXJlIHRvIGZpbmQgdGhlIHdhcm5pbmdzLiAqLw0KKyAgICBCRF9QSl9XQVJOX0JESU1BRF9XQVJOSU5HX0FTU0VSVEVEICAgICAgICAgICA9IDEsDQorICAgIC8qKjwgRXJyb3Igbm90IGlkZW50aWZpZWQuICovDQorICAgIEJEX1BKX0VSUk9SX0dFTkVSSUMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwNCisgICAgLyoqPCBUaGUgcG9pbnRlciBwYXNzZWQgaXMgTlVMTC4gKi8NCisgICAgQkRfUEpfRVJST1JfTlVMTF9QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgPSAzLA0KKyAgICAvKio8IEFsbG9jYXRpb24gcHJvY2VkdXJlIGZhaWxlZC4gKi8NCisgICAgQkRfUEpfRVJST1JfQUxMT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAgPSA0LA0KKyAgICAvKio8IFRoZSBwYXJhbWV0ZXIgaXMgbm90IGV4aXN0ZW50IG9yIHRoZSBzZXQvZ2V0IGZ1bmN0aW9uIGlzIG5vdCBhY3RpdmUuICovDQorICAgIEJEX1BKX0VSUk9SX1BBUkFNRVRFUl9OT1RfRk9VTkQgICAgICAgICAgICAgID0gNSwNCisgICAgLyoqPCBObyBjYXB0dXJlIGRldmljZSBmb3VuZC4gKi8NCisgICAgQkRfUEpfRVJST1JfSU1BRF9OT05FX0NBUFRVUkVfREVWICAgICAgICAgICAgPSAxMCwNCisgICAgLyoqPCBObyBwbGF5IGRldmljZSBmb3VuZC4gKi8NCisgICAgQkRfUEpfRVJST1JfSU1BRF9OT05FX1BMQVlfREVWICAgICAgICAgICAgICAgPSAxMSwNCisgICAgLyoqPCBGcmFtZSBzaXplIG5vdCBhbGxvd2VkLiAqLw0KKyAgICBCRF9QSl9FUlJPUl9JTUFEX0ZSQU1FX1NJWkUgICAgICAgICAgICAgICAgICA9IDEyLA0KKyAgICAvKio8IFNhbXBsZSBmcmVxdWVuY3kgbm90IGFsbG93ZWQuICovDQorICAgIEJEX1BKX0VSUk9SX0lNQURfU0FNUExFX0ZSRVEgICAgICAgICAgICAgICAgID0gMTMsDQorICAgIC8qKjwgU2FtcGxlcyBtaXNzaW5nLiAqLw0KKyAgICBCRF9QSl9FUlJPUl9JTUFEX01JU1NJTkdfU0FNUExFUyAgICAgICAgICAgICA9IDE0LA0KKyAgICAvKio8IERldmljZSBsaXN0IGlzIGVtcHR5LiAqLw0KKyAgICBCRF9QSl9FUlJPUl9JTUFEX0RFVklDRV9MSVNUX0VNUFRZICAgICAgICAgICA9IDE1LA0KKyAgICAvKio8IExpYnJhcnkgbm90IGF1dGhvcml6ZWQsIGVudGVyaW5nIGRlbW8gbW9kZS4gKi8NCisgICAgQkRfUEpfRVJST1JfSU1BRF9MSUJfTk9UX0FVVEhPUklaRUQgICAgICAgICAgPSAxNiwNCisgICAgLyoqPCBUaGUgaW5wdXQgY2hhbm5lbCBtZW1vcnkgaGFzIG5vdCBiZWVuIGFsbG9jYXRlZC4gKi8NCisgICAgQkRfUEpfRVJST1JfSU1BRF9JTlBVVF9DSF9OT1RfQUxMT0NBVEVEICAgICAgPSAxNywNCisgICAgLyoqPCBUaGUgbGlicmFyeSBoYXMgZXhwaXJlZCwgZW50ZXJpbmcgZGVtbyBtb2RlLiAqLw0KKyAgICBCRF9QSl9FUlJPUl9JTUFEX0xJQ0VOU0VfRVhQSVJFRCAgICAgICAgICAgICA9IDE4LA0KKyAgICAvKio8IE9wZW4gb2YgY2FwdHVyZSBkZXZpY2UgZmFpbGVkLiAqLw0KKyAgICBCRF9QSl9FUlJPUl9JTUFEX09QRU5fQ0FQVFVSRV9ERVZfRkFJTEVEICAgICA9IDE5LA0KKyAgICAvKio8IE9wZW4gb2YgcGxheSBkZXZpY2UgZmFpbGVkLiAgKi8NCisgICAgQkRfUEpfRVJST1JfSU1BRF9PUEVOX1BMQVlfREVWX0ZBSUxFRCAgICAgICAgPSAyMCwNCisgICAgLyoqPCBTdGFydCBvZiBwbGF5IGRldmljZSBmYWlsZWQuICovDQorICAgIEJEX1BKX0VSUk9SX0lNQURfU1RBUlRfUExBWV9ERVZfRkFJTEVEICAgICAgID0gMjEsDQorICAgIC8qKjwgU3RhcnQgb2YgY2FwdHVyZSBkZXZpY2UgZmFpbGVkLiAqLw0KKyAgICBCRF9QSl9FUlJPUl9JTUFEX1NUQVJUX0NBUFRVUkVfREVWX0ZBSUxFRCAgICA9IDIyLA0KKyAgICAvKio8IFN0YXJ0IG9mIHRpbWUgcHJvY2VzcyBmYWlsZWQuICovDQorICAgIEJEX1BKX0VSUk9SX0lNQURfU1RBUlRfVElNRV9QUk9DRVNTX0ZBSUxFRCAgID0gMjMsDQorICAgIC8qKjwgU3RhcnQgb2YgdGhyZWFkIHByb2Nlc3MgZmFpbGVkLiAqLw0KKyAgICBCRF9QSl9FUlJPUl9JTUFEX1RIUkVBRF9QUk9DRVNTX0ZBSUxFRCAgICAgICA9IDI0LA0KKyAgICAvKio8IE5vIHZvbHVtZSBjb250cm9sIGF2YWlsYWJsZS4gKi8NCisgICAgQkRfUEpfRVJST1JfSU1BRF9OT19WT0xfQ09OVFJPTF9BVkFJTEFCTEUgICAgPSAyNSwNCit9IGJkSU1BRHBqX1N0YXR1czsNCisNCisvKioNCisgKiBAYnJpZWYgUGFyYW1ldGVyIHRvIHBhc3MgdG8gc2V0IGFuZCBnZXQgcGFyYW1ldGVyIGZ1bmN0aW9ucy4gDQorICoNCisgKiBGb3IgZWFjaCBlbnVtZXJhdGlvbiBhcmUgZGVmaW5lZCB0aGUgZGF0YSB0eXBlIGFuZCB0aGUgc3VwcG9ydGVkIG9wZXJhdGlvbnMNCisgKiBvbiB0aGF0IHBhcmFtZXRlciAoc2V0IGFuZCBnZXQpLg0KKyAqLw0KKyAgIA0KK3R5cGVkZWYgZW51bSBiZElNQURwal9QYXJhbWV0ZXJ7DQorICAgIC8qKjwgaW50KiAgIFxuIHNldC9nZXQgXG4gMSBlbmFibGUgLyAwIGRpc2FibGUgZWNobyBjYW5jZWxsYXRpb24uICovDQorICAgIEJEX1BBUkFNX0lNQURfUEpfQUVDX0VOQUJMRSAgICAgICAgICAgICAgICAgPSAxLA0KKyAgICAvKio8IGludCogICBcbiBzZXQvZ2V0IFxuIDEgZW5hYmxlIC8gMCBkaXNhYmxlIG1pY3JvcGhvbmUgY29udHJvbA0KKyAgICAgKiAod2hlbiBwb3NzaWJsZSkuICovDQorICAgIEJEX1BBUkFNX0lNQURfUEpfTUlDX0NPTlRST0xfRU5BQkxFICAgICAgICAgPSAyLA0KKyAgICAvKio8IGludCogICBcbiBzZXQvZ2V0IFxuIDEgZWJhYmxlIC8gMCBkaXNhYmxlIG5vaXNlIHJlZHVjdGlvbi4gKi8NCisgICAgQkRfUEFSQU1fSU1BRF9QSl9OT0lTRV9SRURVQ1RJT05fRU5BQkxFICAgICA9IDMsDQorICAgIC8qKjwgaW50KiAgIFxuIHNldCAgICAgXG4gbnVtYmVyIG9mIGNoYW5uZWwgdG8gcmVzZXQuIFVzZWQgdG8gcmVzZXQNCisgICAgICogdGhlIGlucHV0IGNoYW5uZWwgc3RhdGlzdGljcy4gVG8gYmUgdXNlZCB3aGVuIHRoZSBzYW1lIGNoYW5uZWwNCisgICAgICogaXMgYXNzaWduZWQgdG8gYW5vdGhlciBwYXJ0ZWNpcGFudC4gKi8NCisgICAgQkRfUEFSQU1fSU1BRF9QSl9SRVNFVF9TVEFUSVNUSUNfSU5fQ0ggICAgICA9IDQsDQorICAgIC8qKjwgZmxvYXQqIFxuIHNldC9nZXQgXG4gMC4wZiAtPiAxLjBmIHZvbHVtZSBvZg0KKyAgICAgKiB0aGUgbWljcm9waG9uZSh3aGVuIHBvc3NpYmxlKS4gKi8NCisgICAgQkRfUEFSQU1fSU1BRF9QSl9NSUNfVk9MVU1FICAgICAgICAgICAgICAgICA9IDUsDQorICAgIC8qKjwgaW50KiAgIFxuIHNldC9nZXQgXG4gMCBtdXRlIC8gMSBub3QgbXV0ZSBvbiBtaWNyb3Bob25lDQorICAgICAqICh3aGVuIHBvc3NpYmxlKS4gKi8NCisgICAgQkRfUEFSQU1fSU1BRF9QSl9NSUNfTVVURSAgICAgICAgICAgICAgICAgICA9IDYsDQorICAgIC8qKjwgZmxvYXQqIFxuIHNldC9nZXQgXG4gMC4wZiAtPiAxLjBmIHZvbHVtZSBvZiB0aGUgc3BlYWtlci4gKi8NCisgICAgQkRfUEFSQU1fSU1BRF9QSl9TUEtfVk9MVU1FICAgICAgICAgICAgICAgICA9IDcsDQorICAgIC8qKjwgaW50KiAgIFxuIHNldC9nZXQgXG4gMCBtdXRlIC8gMSBub3QgbXV0ZSBvbiBzcGVha2VyLiAqLw0KKyAgICBCRF9QQVJBTV9JTUFEX1BKX1NQS19NVVRFICAgICAgICAgICAgICAgICAgID0gOCwNCit9IGJkSU1BRHBqX1BhcmFtZXRlcjsNCisNCisNCisvKioNCisgKiBAYnJpZWYgSW5zdGFuY2Ugc3RydWN0dXJlIGZvciB0aGUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBhZWMgZW5naW5lLg0KKyAqLw0KKw0KK3R5cGVkZWYgc3RydWN0IGJkSU1BRHBqX1NldHRpbmdfdHsNCisgICAgLyoqPCBTYW1wbGUgZnJlcXVlbmN5ICg4a0h6IG9yIDE2a0h6KS4gKi8NCisgICAgaW50ICAgICAgICAgICAgICAgICBTYW1wbGluZ0ZyZXF1ZW5jeTsNCisgICAgLyoqPCBBdWRpbyBidWZmZXIgbWFuYWdlZCBieSB0aGUgYWVjIGJkSU1BRCBmdW5jdGlvbnMuDQorICAgICAqIChmcm9tIDE2bXMgdG8gODBtcywgMTZtcyByZWNvbW1lbmRlZCkuICovDQorICAgIGludCAgICAgICAgICAgICAgICAgRnJhbWVTaXplX21zOw0KKyAgICAvKio8IFBvaW50cyB0byB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvbnMgaW4gdGhlIHZhbGlkYXRpb24gbGlicmFyeS4gKi8NCisgICAgdm9pZCAgICAgICAgICAgICAgICAqdmFsaWRhdGU7DQorICAgIC8qKjwgUG9pbnRzIHRvIHRoZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdXNlZCBmb3IgZmlsbGluZw0KKyAgICAgKiB0aGUgcGxheWJhY2sgYnVmZmVyIG9mIGJkSU1BRC4gKi8NCisgICAgY2JfZmlsbFBsYXlCYWNrQl90ICBjYl9maWxsUGxheUJhY2tCdWZmZXI7DQorICAgIC8qKjwgUG9pbnRzIHRvIHVzZXIgZGF0YSB0byBwYXNzIHRvIHRoZSBjYWxsYmFjay4gKi8NCisgICAgdm9pZCAgICAgICAgICAgICAgICAqY2JfZmlsbFBsYXlCYWNrQnVmZmVyX3VzZXJfZGF0YTsNCisgICAgLyoqPCBQb2ludHMgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgZm9yIHJldHJlaXZlIHRoZSBwcm9jZXNzZWQNCisgICAgICogYXVkaW8gcHJlc2VudCBpbiB0aGUgY2FwdHVyZSBidWZmZXIgb2YgYmRJTUFELiAqLw0KKyAgICBjYl9lbXB0eUNhcHR1cmVCX3QgIGNiX2VtcHR5Q2FwdHVyZUJ1ZmZlcjsNCisgICAgLyoqPCBQb2ludHMgdG8gdXNlciBkYXRhIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrLiAqLw0KKyAgICB2b2lkICAgICAgICAgICAgICAgICpjYl9lbXB0eUNhcHR1cmVCdWZmZXJfdXNlcl9kYXRhOw0KKyAgICAvKio8IElzIGEgd2lkZSBjaGFyIHBvaW50ZXIgdG8gdGhlIGNhcHR1cmUgZGV2aWNlIG5hbWUuICovDQorICAgIHdjaGFyX3QgICAgICAgICAgICAgKkNhcHR1cmVEZXZpY2U7DQorICAgIC8qKjwgSXMgYSB3aWRlIGNoYXIgcG9pbnRlciB0byB0aGUgcGxheSBkZXZpY2UgbmFtZS4gKi8NCisgICAgd2NoYXJfdCAgICAgICAgICAgICAqUGxheURldmljZTsNCisgICAgLyoqPCBUcnVlIHRvIGVuYWJsZSBkaWFnbm9zdGljLCBmYWxzZSB0byBkaXNhYmxlLiAqLw0KKyAgICBpbnQgCSAgICAgICAgICAgIERpYWdub3N0aWNFbmFibGU7DQorICAgIC8qKjwgRGlyZWN0b3J5IHdoaWNoIHdpbGwgY29udGFpbnMgdGhlIGZpbGVzIGdlbmVyYXRlZCBmb3IgZGlhZ25vc3RpYy4gKi8NCisgICAgd2NoYXJfdCAgICAgICAgICAgICAqRGlhZ25vc3RpY0ZvbGRlclBhdGg7DQorICAgIC8qKjwgSXMgYW4gYXV4aWxpYXJ5IHNldHRpbmdzIHBvaW50ZXIgdXNlZCBpbnRlcm5hbGx5IGJ5IGJkSU1BRC4gKi8NCisgICAgdm9pZCAgICAgICAgICAgICAgICAqYmRJTUFEd3JfU2V0dGluZ3NEYXRhOw0KK30gYmRJTUFEcGpfU2V0dGluZ190Ow0KKw0KKy8qKg0KKyAqIEBicmllZiBJbnN0YW5jZSBzdHJ1Y3R1cmUgZm9yIHRoZSB3YXJuaW5ncyBnZW5lcmF0ZWQgYnkgdGhlIGluaXRpYWxpemF0aW9uDQorICogZnVuY3Rpb25zLg0KKyAqLw0KKw0KK3R5cGVkZWYgc3RydWN0IGJkSU1BRHBqX1dhcm5pbmdzX3R7DQorICAgIC8qKjwgVGhlIGNhcHR1cmUgZGV2aWNlIGluZGljYXRlZCBjYW4ndCBiZSBvcGVuZWQsIGhhcyBiZWVuIHNlbGVjdGVkDQorICAgICAqIHRoZSBkZWZhdWx0IGNhcHR1cmUgZGV2aWNlLiAqLw0KKyAgICBpbnQgRGVmYXVsdENhcHR1cmVEZXZpY2VBdXRvbWF0aWNhbGx5U2VsZWN0ZWQ7DQorICAgIC8qKjwgVGhlIGNhcHR1cmUgZGV2aWNlIG9wZW5lZCBoYXMgbm90IHZvbHVtZSBjb250cm9sLiAqLw0KKyAgICBpbnQgQ2FwdHVyZURldmljZVdpdGhvdXRWb2x1bWVDb250cm9sOw0KKyAgICAvKio8IFRoZSBwbGF5IGRldmljZSBpbmRpY2F0ZWQgY2FuJ3QgYmUgb3BlbmVkLCBoYXMgYmVlbiBzZWxlY3RlZA0KKyAgICAgKiB0aGUgZGVmYXVsdCBwbGF5IGRldmljZS4gKi8NCisgICAgaW50IERlZmF1bHRQbGF5RGV2aWNlQXV0b21hdGljYWxseVNlbGVjdGVkOw0KKyAgICAvKio8IFRoZSBudW1iZXIgb2YgY2hhbm5lbCByZXF1ZXN0ZWQgaXMgb3V0IG9mIHJhbmdlLiBUaGUgbnVtYmVyIG9mDQorICAgICAqIGNoYW5uZWwgb3BlbmVkIGlzIGVxdWFsIHRvIHRoZSBtYXhpbXVtLiAqLw0KKyAgICBpbnQgTnVtYmVyT2ZDaGFubmVsc091dE9mUmFuZ2U7DQorICAgIC8qKjwgVGhlIGRpYWdub3N0aWMgZmlsZXMgY291bGQgbm90IGJlIHNhdmVkLiAqLw0KKyAgICBpbnQgRGlhZ25vc3RpY1NhdmVOb3RBbGxvd2VkOw0KKyAgICAvKio8IFRoZSBubHAgbGV2ZWwgcmVxdWVzdGVkIGlzIG5vdCBhbGxvd2VkLCBpdCBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5DQorICAgICAqIGNoYW5nZWQgdG8gdGhlIGRlZmF1bHQgdmFsdWUuICovDQorICAgIGludCBubHBMZXZlbENoYW5nZVNldHR0aW5nOw0KKyAgICAvKio8IE5vIGNhcHR1cmUgZGV2aWNlIGlzIHByZXNlbnQuIEFueXdheSB0aGUgYmRTRVMgaGFzIGJlZW4NCisgICAgICogaXN0YW50aWF0ZWQgb25seSBmb3IgcGxheWJhY2suICovDQorICAgIGludCBOb0NhcHR1cmVEZXZpY2VQcmVzZW50Ow0KKyAgICAvKio8IFRoZSBjcHUgaXMgbm90IGFkYXB0IHRvIHJ1biB0aGUgYWVjIGVuZ2luZSwgdGhlIGFlYyBoYXMgYmVlbiBkaXNhYmxlZC4NCisgICAgICogVGhpcyBhcHBlbnMgZm9yIHZlcnkgb2xkIGNwdSBsaWtlIHBlbnRpdW0gSUlJLiAqLw0KKyAgICBpbnQgb2xkQ1BVZGV0ZWN0ZWRfQUVDZGlzYWJsZTsNCisgICAgLyoqPCBXaW5kb3dzIERpcmVjdCBTb3VuZCBlcnJvci4gKi8NCisgICAgbG9uZyBkaXJlY3RTb3VuZEVycm9yOw0KKyAgICAvKio8IFdpbmRvd3MgRGlyZWN0IFNvdW5kIHZvbHVtZSBlcnJvci4gKi8NCisgICAgbG9uZyBkaXJlY3RTb3VuZExldmVsOw0KKyAgICAvKio8IE5vIHBsYXkgZGV2aWNlIGlzIHByZXNlbnQuIEFueXdheSB0aGUgYmRTRVMgaGFzIGJlZW4gaXN0YW50aWF0ZWQNCisgICAgICogb25seSBmb3IgY2FwdHVyZS4gKi8NCisgICAgaW50IE5vUGxheURldmljZVByZXNlbnQ7DQorfSBiZElNQURwal9XYXJuaW5nc190Ow0KKw0KKy8qKg0KKyAqIEBicmllZiBJbnN0YW5jZSBzdHJ1Y3R1cmUgZm9yIHRoZSBsaWJyYXJ5IHZlcnNpb24NCisgKi8NCisNCit0eXBlZGVmIHN0cnVjdCBiZElNQURwal9saWJWZXJzaW9uX3R7DQorICAgIGludCAgICAgbWFqb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IG1ham9yIHZlcnNpb24uICovDQorICAgIGludAkgICAgbWlub3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IG1pbm9yIHZlcnNpb24uICovDQorICAgIGludAkgICAgYnVpbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJ1aWxkIG51bWJlci4gKi8NCisgICAgY2hhciAgICAqbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgbmFtZSAiYmRJTUFEcGogdmVyLlgiLiAqLw0KKyAgICBjaGFyICAgICp2ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiZXRhLCBSQywgcmVsZWFzZS4gKi8NCisgICAgY2hhciAgICAqYnVpbGREYXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYnVpbGQgZGF0ZS4gKi8NCit9IGJkSU1BRHBqX2xpYlZlcnNpb25fdDsNCisNCisvKioNCisgKiBAfQ0KKyAqLw0KKw0KKw0KKw0KKy8qKg0KKyAqIEBhZGR0b2dyb3VwIGdyb3VwRnVuY3Rpb24NCisgKiBAew0KKyAqLw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KKw0KKy8qKg0KKyAqIEBicmllZiBNdXN0IGJlIHVzZWQgdG8gYWxsb2NhdGUgYW5kIHNldCB0byBkZWZhdWx0IHBhcmFtZXRlciB0aGUgbWVtb3J5DQorICogZm9yIHRoZSBiZElNQUQuDQorICoNCisgKiBUaGUgZnVuY3Rpb24gZ2VuZXJhdGUgYSBzdHJ1Y3R1cmUgYmRJTUFEcGpfU2V0dGluZ190IGZpbGxlZCB3aXRoIHRoZQ0KKyAqIGRlZmF1bHQgc2V0dGluZ3MuDQorICogXG4gVGhlIHVzZXIgY2FuIGNoYW5nZSB0aGlzIHNldHRpbmdzIGFjY29yZGluZyB0byB0aGUgbmVlZCBhbmQgdGhlbg0KKyAqIGxhdW5jaCB0aGUgOjpiZElNQURwal9Jbml0QUVDLg0KKyAqIFxuIFRoZSBmdW5jdGlvbiBnZW5lcmF0ZSBhbHNvIGEgd2FybmluZyBzdHJ1Y3R1cmUgKDo6YmRJTUFEcGpfV2FybmluZ3NfdCkNCisgKiB0aGF0IGNvdWxkIGJlIHVzZWQgaW4gOjpiZElNQURwal9Jbml0QUVDIHRvIGhhbmRsZSBldmVudHVhbCB3YXJuaW5ncy4NCisgKiBAcGFyYW1bb3V0XSAqKnBwU2V0dGluZ3MgICAgICAgICAgICBQb2ludHMgdG8gdGhlIHBvaW50ZXIgb2YgdGhlDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIDo6YmRJTUFEcGpfU2V0dGluZ190Lg0KKyAqIEBwYXJhbVtvdXRdICoqcHBXYXJuaW5nTWVzc2FnZXMgICAgIFBvaW50cyB0byB0aGUgcG9pbnRlciBvZiB0aGUNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgOjpiZElNQURwal9XYXJuaW5nc190Lg0KKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6QkRfUEpfT0sgaWYgdGhlIGZ1bmN0aW9uIGhhcyBiZWVuDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIHJldHVybg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGVycm9yIChyZWZlciB0byA6OmJkSU1BRHBqX1N0YXR1cykuDQorICovDQorQkRJTUFEUEpfQVBJIGJkSU1BRHBqX1N0YXR1cyBiZElNQURwal9DcmVhdGVTdHJ1Y3R1cmVzKA0KKwkJCQkgICAgYmRJTUFEcGpfU2V0dGluZ190ICoqcHBTZXR0aW5ncywNCisJCQkJICAgIGJkSU1BRHBqX1dhcm5pbmdzX3QgKipwcFdhcm5pbmdNZXNzYWdlcyk7DQorDQorLyoqDQorICogQGJyaWVmIElzIHVzZWQgdG8gZnJlZSB0aGUgbWVtb3J5IGZvciB0aGUgOjpiZElNQURwal9TZXR0aW5nX3Qgc3RydWN0dXJlIGFuZA0KKyAqIDo6YmRJTUFEcGpfV2FybmluZ3NfdCBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGgNCisgKiB0aGUgOjpiZElNQURwal9DcmVhdGVTdHJ1Y3R1cmVzLg0KKyAqIEBwYXJhbVtpbl0gKipwcFNldHRpbmdzICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBtZW1vcnkgbG9jYXRpb24gZmlsbGVkDQorICogCQkJCSAgICAgICB3aXRoIHRoZSBhZGRyZXNzIG9mIHRoZQ0KKyAqIAkJCQkgICAgICAgOjpiZElNQURwal9TZXR0aW5nX3Qgc3RydWN0dXJlIHRvIGZyZWUuDQorICogVGhpcyBhZGRyZXNzIHdpbGwgYmUgc2V0IHRvIE5VTEwuDQorICogQHBhcmFtW2luXSAqKnBwV2FybmluZ01lc3NhZ2VzICAgICAgUG9pbnRlciB0byBhIG1lbW9yeSBsb2NhdGlvbiBmaWxsZWQNCisgKiAJCQkJICAgICAgIHdpdGggdGhlIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZA0KKyAqIAkJCQkgICAgICAgOjpiZElNQURwal9XYXJuaW5nc190IHN0cnVjdHVyZSB0byBmcmVlLg0KKyAqIAkJCQkgICAgICAgVGhpcyBhZGRyZXNzIHdpbGwgYmUgc2V0IHRvIE5VTEwuDQorICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpCRF9QSl9PSyBpZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4NCisgKiAJCQkJICAgICAgIHBlcmZvcm1lZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZSByZXR1cm4NCisgKiAJCQkJICAgICAgIGFuIGVycm9yIChyZWZlciB0byA6OmJkSU1BRHBqX1N0YXR1cykuDQorICovDQorQkRJTUFEUEpfQVBJIGJkSU1BRHBqX1N0YXR1cyBiZElNQURwal9GcmVlU3RydWN0dXJlcygNCisJCQkJICAgIGJkSU1BRHBqX1NldHRpbmdfdCAqKnBwU2V0dGluZ3MsDQorCQkJCSAgICBiZElNQURwal9XYXJuaW5nc190ICoqcHBXYXJuaW5nTWVzc2FnZXMpOw0KKw0KKy8qKg0KKyAqIEBicmllZiBJcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1lbW9yeSBmb3IgYmRJTUFEIHdpdGggdGhlIHNldHRpbmdzDQorICogY29udGFpbmVkIGluIHRoZSA8Y29kZT5wcFNldHRpbmdzPC9jb2RlPi4NCisgKiBAcGFyYW1bb3V0XSAqcEJkSU1BREluc3RhbmNlICAgICAgICBJcyB0aGUgcG9pbnRlciB0byB0aGUgYmRJTUFEIG9iamVjdC4NCisgKiBAcGFyYW1baW5dICoqcHBTZXR0aW5ncyAgICAgICAgICAgICBQb2ludGVyIHRvIHBvaW50ZXIgdG8gYQ0KKyAqIAkJCQkgICAgICAgOjpiZElNQURwal9TZXR0aW5nX3Qgc3RydWN0dXJlLCBmaWxsZWQNCisgKiAJCQkJICAgICAgIHdpdGggaW5pdGlhbGl6YXRpb24gc2V0dGluZ3MgdG8gYmUNCisgKiAJCQkJICAgICAgIGFwcGxpZWQgdG8gdGhlIGJkSU1BRC4NCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiBOb3RlLCB0aGUgPGNvZGU+cEJkSU1BREluc3RhbmNlPC9jb2RlPg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG1vZGlmaWVkIHdpdGggdGhlIGFwcGxpZWQgc2V0dGluZ3MuDQorICogQHBhcmFtW291dF0gKipwcFdhcm5pbmdNZXNzYWdlcyAgICAgUG9pbnRlciB0byBwb2ludGVyIHRvIGENCisgKiAJCQkJICAgICAgIDo6YmRJTUFEcGpfV2FybmluZ3NfdCBzcnVjdHVyZSwNCisgKiAJCQkJICAgICAgIHdoaWNoIHJlcG9ydHMgdGhlIHdhcm5pbmdzIGFmdGVyIHRoZQ0KKyAqIAkJCQkgICAgICAgaW5pdGlhbGl6YXRpb24uDQorICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpCRF9QSl9PSyBpZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4NCisgKiAJCQkJICAgICAgIHBlcmZvcm1lZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZSByZXR1cm4NCisgKiAJCQkJICAgICAgIGFuIGVycm9yIChyZWZlciB0byA6OmJkSU1BRHBqX1N0YXR1cykuDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gSWYgdGhlIGVycm9yIGlzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpCRF9QSl9XQVJOX0JESU1BRF9XQVJOSU5HX0FTU0VSVEVEDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGluaXQgaGFzIGJlZW4gcGVyZm9ybWVkIHdpdGggc3VjY2VzcywNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgd2l0aCBhIGRpZmZlcmVudCBzZXR0aW5ncw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3QgdG8gdGhlIG9uZXMgcmVxdWlyZWQuDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtYWlubHkgaGFwcGVucyBpZiB0aGUgYXVkaW8NCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Ugb3BlbmVkIGlzIGRpZmZlcmVudCB0byB0aGUNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgcmVxdWVzdGVkLg0KKyAqLw0KK0JESU1BRFBKX0FQSSBiZElNQURwal9TdGF0dXMgYmRJTUFEcGpfSW5pdEFFQyhiZElNQURwaiAqcEJkSU1BREluc3RhbmNlLA0KKwkJCQkgICAgICBiZElNQURwal9TZXR0aW5nX3QgKipwcFNldHRpbmdzLA0KKwkJCQkgICAgICBiZElNQURwal9XYXJuaW5nc190ICoqcHBXYXJuaW5nTWVzc2FnZXMpOw0KKw0KKy8qKg0KKyAqIEBicmllZiBJcyB1c2VkIHRvIGZyZWUgdGhlIGJkSU1BRCBvYmplY3QgcG9pbnRlZCBieSB0aGUNCisgKiA8Y29kZT5wQmRJTUFESW5zdGFuY2U8L2NvZGU+Lg0KKyAqIEBwYXJhbVtpbl0gKnBCZElNQURJbnN0YW5jZSAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJkSU1BRCBvYmplY3QgdG8gZnJlZS4NCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkJEX1BKX09LIGlmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbg0KKyAqIAkJCQkgICAgICAgcGVyZm9ybWVkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIHJldHVybg0KKyAqIAkJCQkgICAgICAgYW4gZXJyb3IgKHJlZmVyIHRvIDo6YmRJTUFEcGpfU3RhdHVzKS4NCisgKi8NCitCRElNQURQSl9BUEkgYmRJTUFEcGpfU3RhdHVzIGJkSU1BRHBqX0ZyZWVBRUMoYmRJTUFEcGogKnBCZElNQURJbnN0YW5jZSk7DQorDQorLyoqDQorICogQGJyaWVmIElzIHVzZWQgdG8gbWFrZSBhIGxpc3Qgb2YgY2FwdXJlIGFuZCBwbGF5IGRldmljZXMgYXZhaWxhYmxlDQorICogb24gdGhlIHN5c3RlbS4NCisgKiBAcGFyYW1baW5dIGNhcHR1cmVEZXZpY2UgICAgICAgICAgICBTZXQgdG8gMSB0byBnZXQgdGhlIGxpc3Qgb2YgY2FwdHVyZQ0KKyAqIAkJCQkgICAgICAgZGV2aWNlcy4gU2V0IHRvIDAgdG8gZ2V0IHRoZSBsaXN0IG9mDQorICogCQkJCSAgICAgICBwbGF5IGRldmljZXMuDQorICogQHBhcmFtW2luXSAqKmRldmljZU5hbWUgICAgICAgICAgICAgUG9pbnRlciB0byBwb2ludGVyIHRvIGEgd2lkZSBjaGFyDQorICogCQkJCSAgICAgICBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBjYXB0dXJlL3BsYXkNCisgKiAJCQkJICAgICAgIGRldmljZXMuDQorICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpCRF9QSl9PSyBpZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4NCisgKiAJCQkJICAgICAgIHBlcmZvcm1lZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZSByZXR1cm4NCisgKiAJCQkJICAgICAgIGFuIGVycm9yIChyZWZlciB0byA6OmJkSU1BRHBqX1N0YXR1cykuDQorICovDQorQkRJTUFEUEpfQVBJIGJkSU1BRHBqX1N0YXR1cyBiZElNQURwal9nZXREZXZpY2VOYW1lKGludCBjYXB0dXJlRGV2aWNlLA0KKwkJCQkJCSAgICB3Y2hhcl90ICoqZGV2aWNlTmFtZSk7DQorDQorLyoqDQorICogQGJyaWVmIElzIHVzZWQgdG8gZnJlZXplIHRoZSBiZElNQUQsIHN0b3BwaW5nIHRoZSBhdWRpbyBwbGF5YmFjaw0KKyAqIGFuZCByZWNvcmRpbmcuDQorICogQHBhcmFtW2luXSBiZElNQURJbnN0YW5jZSAgICAgICAgICAgYmRJTUFEIG9iamVjdC4NCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkJEX1BKX09LIGlmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbg0KKyAqIAkJCQkgICAgICAgcGVyZm9ybWVkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlDQorICogCQkJCSAgICAgICByZXR1cm4gYW4gZXJyb3IgKHJlZmVyIHRvDQorICogCQkJCSAgICAgICA6OmJkSU1BRHBqX1N0YXR1cykuDQorICovDQorQkRJTUFEUEpfQVBJIGJkSU1BRHBqX1N0YXR1cyBiZElNQURwal9zdG9wKGJkSU1BRHBqIGJkSU1BREluc3RhbmNlKTsNCisNCisvKioNCisgKiBAYnJpZWYgSXMgdXNlZCB0byBwdXQgYmFjayBpbiBwbGF5IHRoZSBhdWRpbyBhZnRlciBpdCBoYXMgYmVlbiBzdG9wcGVkIGJ5IHRoZQ0KKyAqIDo6YmRJTUFEcGpfc3RvcCBmdW5jdGlvbnMuDQorICogQHBhcmFtW2luXSBiZElNQURJbnN0YW5jZSAgICAgICAgICAgYmRJTUFEIG9iamVjdC4NCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkJEX1BKX09LIGlmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbg0KKyAqIAkJCQkgICAgICAgcGVyZm9ybWVkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlDQorICogCQkJCSAgICAgICByZXR1cm4gYW4gZXJyb3IgKHJlZmVyIHRvDQorICogCQkJCSAgICAgICA6OmJkSU1BRHBqX1N0YXR1cykuDQorICovDQorQkRJTUFEUEpfQVBJIGJkSU1BRHBqX1N0YXR1cyBiZElNQURwal9ydW4oYmRJTUFEcGogYmRJTUFESW5zdGFuY2UpOw0KKw0KKy8qKg0KKyAqIEBicmllZiBQcmludCBvbiBhIHN0YW5kYXJkIG91dHB1dCB0aGUgd2FybmluZyBtZXNzYWdlcy4NCisgKiBAcGFyYW1baW5dICpwV2FybmluZ01lc3NhZ2VzICAgICAgICBQb2ludGVyIHRvIHRoZSB3YXJuaW5nIHN0cnVjdHVyZQ0KKyAqIAkJCQkgICAgICAgdG8gYmUgcHJpbnRlZC4NCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkJEX1BKX09LIGlmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbg0KKyAqIAkJCQkgICAgICAgcGVyZm9ybWVkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlDQorICogCQkJCSAgICAgICByZXR1cm4gYW4gZXJyb3INCisgKiAJCQkJICAgICAgIChyZWZlciB0byA6OmJkSU1BRHBqX1N0YXR1cykuDQorICovDQorQkRJTUFEUEpfQVBJIGJkSU1BRHBqX1N0YXR1cyBiZElNQURwal9EaXNwbGF5V2FybmluZ3MoDQorCQkJCQliZElNQURwal9XYXJuaW5nc190ICpwV2FybmluZ01lc3NhZ2VzKTsNCisNCisvKioNCisgKiBAYnJpZWYgQ2xlYXIgdGhlIHdhcm5pbmcgc3RydWN0dXJlIGFmdGVyIGJlaW5nIHJlYWQuDQorICogQHBhcmFtW291dF0gKipwcFdhcm5pbmdNZXNzYWdlcyAgICAgUG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSB3YXJuaW5nDQorICogCQkJCSAgICAgICBzdHJ1Y3R1cmUgdG8gYmUgY2xlYXJlZC4NCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkJEX1BKX09LIGlmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbg0KKyAqIAkJCQkgICAgICAgcGVyZm9ybWVkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlDQorICogCQkJCSAgICAgICByZXR1cm4gYW4gZXJyb3IgKHJlZmVyIHRvDQorICogCQkJCSAgICAgICA6OmJkSU1BRHBqX1N0YXR1cykuDQorICovDQorQkRJTUFEUEpfQVBJIGJkSU1BRHBqX1N0YXR1cyBiZElNQURwal9DbGVhckFsbFdhcm5pbmdzKA0KKwkJCQkgICAgICAgYmRJTUFEcGpfV2FybmluZ3NfdCAqKnBwV2FybmluZ01lc3NhZ2VzKTsNCisNCisvKioNCisgKiBAYnJpZWYgSXMgdXNlZCB0byBzZXQgYSBwYXJhbWV0ZXIgb2YgdGhlIGJkSU1BRCBvYmplY3QgcG9pbnRlZCBieSB0aGUNCisgKiA8Y29kZT5wQmRJTUFESW5zdGFuY2U8L2NvZGU+Lg0KKyAqIEBwYXJhbVtpbl0gYmRJTUFESW5zdGFuY2UgICAgICAgICAgIGJkSU1BRCBvYmplY3QuDQorICogQHBhcmFtW2luXSBwYXJhbWV0ZXJOYW1lICAgICAgICAgICAgSW5kaWNhdGUgdGhlIHBhcmFtZXRlciB0byBzZXQuDQorICogQHBhcmFtW2luXSAqcFZhbHVlICAgICAgICAgICAgICAgICAgSXMgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSB0byBzZXQNCisgKiAJCQkJICAgICAgIGNhc3QgdG8gdm9pZC4NCisgKiAJCQkJICAgICAgIFxuIEluIHRoZSA6OmJkSU1BRHBqX1BhcmFtZXRlcg0KKyAqIAkJCQkgICAgICAgZGVjbGFyYXRpb24gaXMgaW5kaWNhdGVkIHRoZSByZWFsIHR5cGUgb2YNCisgKiAJCQkJICAgICAgIHRoZSB2YWx1ZSwgZGVwZW5kaW5nIG9uIHRoZQ0KKyAqIAkJCQkgICAgICAgPGNvZGU+cGFyYW1ldGVyTmFtZTwvY29kZT4uDQorICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpCRF9QSl9PSyBpZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4NCisgKiAJCQkJICAgICAgIHBlcmZvcm1lZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZQ0KKyAqIAkJCQkgICAgICAgcmV0dXJuIGFuIGVycm9yIChyZWZlciB0bw0KKyAqIAkJCQkgICAgICAgpzo6YmRJTUFEcGpfU3RhdHVzKS4NCisgKi8NCitCRElNQURQSl9BUEkgYmRJTUFEcGpfU3RhdHVzIGJkSU1BRHBqX3NldFBhcmFtZXRlcihiZElNQURwaiBiZElNQURJbnN0YW5jZSwNCisJCQkJYmRJTUFEcGpfUGFyYW1ldGVyIHBhcmFtZXRlck5hbWUsIHZvaWQgKnBWYWx1ZSk7DQorDQorLyoqDQorICogQGJyaWVmIElzIHVzZWQgdG8gZ2V0IGEgcGFyYW1ldGVyIG9mIHRoZSBiZElNQUQgb2JqZWN0IHBvaW50ZWQgYnkgdGhlDQorICogPGNvZGU+cEJkSU1BREluc3RhbmNlPC9jb2RlPi4NCisgKiBAcGFyYW1baW5dIGJkSU1BREluc3RhbmNlICAgICAgICAgICBiZElNQUQgb2JqZWN0Lg0KKyAqIEBwYXJhbVtpbl0gcGFyYW1ldGVyTmFtZSAgICAgICAgICAgIEluZGljYXRlIHRoZSBwYXJhbWV0ZXIgdG8gZ2V0Lg0KKyAqIEBwYXJhbVtvdXRdICpwVmFsdWUgICAgICAgICAgICAgICAgIElzIGEgcG9pbnRlciB0byB0aGUgdmFsdWUgdG8gZ2V0IGNhc3QNCisgKiAJCQkJICAgICAgIHRvIHZvaWQuIFxuIEluIHRoZQ0KKyAqIAkJCQkgICAgICAgOjpiZElNQURwal9QYXJhbWV0ZXIgZGVjbGFyYXRpb24gaXMNCisgKiAJCQkJICAgICAgIGluZGljYXRlZCB0aGUgcmVhbCB0eXBlIG9mIHRoZSB2YWx1ZSwNCisgKiAJCQkJICAgICAgIGRlcGVuZGluZyBvbiB0aGUNCisgKiAJCQkJICAgICAgIDxjb2RlPnBhcmFtZXRlck5hbWU8L2NvZGU+Lg0KKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6QkRfUEpfT0sgaWYgdGhlIGZ1bmN0aW9uIGhhcyBiZWVuDQorICogCQkJCSAgICAgICBwZXJmb3JtZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgcmV0dXJuDQorICogCQkJCSAgICAgICBhbiBlcnJvciAocmVmZXIgdG8gOjpiZElNQURwal9TdGF0dXMpLg0KKyAqLw0KK0JESU1BRFBKX0FQSSBiZElNQURwal9TdGF0dXMgYmRJTUFEcGpfZ2V0UGFyYW1ldGVyKGJkSU1BRHBqIGJkSU1BREluc3RhbmNlLA0KKwkJCQliZElNQURwal9QYXJhbWV0ZXIgcGFyYW1ldGVyTmFtZSwgdm9pZCAqcFZhbHVlKTsNCisNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorLyoqDQorICogQH0NCisgKi8NCisNCisjZW5kaWYgLy9CRF9JTUFEX1BKX0hfXw0K